How to perform replacements in an input string, only if a RegEx pattern is matched before the string?

Question:

Example 1:

input_text = "A las 19:30 de la tarde salimos!! hay que tener cuidado porque a eso de las 19:30pm de la tarde pasan muchos autos, ademas es importante llegar alla antes de las 20 30 hs, ya que a las 21:00 pm cierran alg1s negocios, sin embargo el cine esta abierto hasta las 23:30 pm de la noche"

The output that I need is:

input_text = "A las 19:30 pm salimos!! hay que tener cuidado porque a eso de las 19:30pm pasan muchos autos, ademas  es importante llegar alla antes de las 20 30 hs, ya que a las 21:00 pm cierran alg1s negocios, sin embargo el cine esta abierto hasta las 23:30 pm"

Example 2:

"Tras pasar las horas de la tarde a las 19:30 de la noche salimos de la casa juntos!! es importante llegar alla antes de las 20:30 pm de la noche, ya que a las 21:00 pm de la noche cierran alg1s negocios, sin embargo el cine esta abierto hasta la 21:00 de la noche"

The output that I need is:

"Tras pasar las horas de la tarde a las 19:30 pm salimos de la casa juntos!! es importante llegar alla antes de las 20:30 pm, ya que a las 21:00 pm de la noche cierran alg1s negocios, sin embargo el cine esta abierto hasta la 21:00 pm"

If it says "en la noche" or "de la tarde" after "pm" or "am" then

XX:XX am or XX:XX pm or XX:XXam or XX:XXpm, and then "en la noche" or "de la tarde"

.replace("en la noche", "")
.replace("de la tarde", "")

If it says "en la noche" or "de la tarde" but there is no "pm" or "am" in front of it then…

XX:XX and then "en la noche" or "de la tarde"

.replace("en la noche", "pm")
.replace("de la tarde", "pm")

The problem is that I can’t know how many times I will have to replace it in the original string and how many times I won’t (there might even be a case where I enter an input_string where no replacement can be done since there are no patterns to match)

In these examples only indicate the cases of "en la noche" and "de la tarde", but other substrings that must fulfill the same function would be for example "por la noche", "por la tarde", "de la noche", "del atardecer", "entrada la noche", "entrada la tarde", etc…
I suppose that these are cases that I would later add to a multiple option regex, however it is important that the regex allows adding more options in case it is required in the future.

What would be a regular expression to limit replacements to only cases where these patterns occur?

Answers:

I’d split the algorithm to two parts:

import re

words = r"(?:en la noche|de la tarde|de la noche)"

s = "A las 19:30 de la tarde salimos!! hay que tener cuidado porque a eso de las 19:30pm de la tarde pasan muchos autos, ademas es importante llegar alla antes de las 20 30 hs, ya que a las 21:00 pm cierran alg1s negocios, sin embargo el cine esta abierto hasta las 23:30 pm de la noche"

pat1 = re.compile(rf"(d+[s:]+d+)s*{words}")
pat2 = re.compile(fr"(d+[s:]+d+s*pm)s*{words}")

s = pat1.sub(r"1 pm", s)
s = pat2.sub(r"1", s)
print(s)

Prints:

A las 19:30 pm salimos!! hay que tener cuidado porque a eso de las 19:30pm pasan muchos autos, ademas es importante llegar alla antes de las 20 30 hs, ya que a las 21:00 pm cierran alg1s negocios, sin embargo el cine esta abierto hasta las 23:30 pm

EDIT: Combining words:

import re
from itertools import product

words1 = ["tardecita", "atardecer", "tarde", "anochecer", "trasnoche", "noche"]
words2 = [
    "en la",
    "de la",
    "por la",
    "entrada la",
    "entrado la",
    "de el",
    "en el",
    "por el",
    "entrada el",
    "entrado el",
]

words = (
    "(?:" + "|".join(f"{w1} {w2}" for w1, w2 in product(words2, words1)) + ")"
)

s = "Tras pasar las horas de la tarde a las 19:30 de la noche salimos de la casa juntos!! es importante llegar alla antes de las 20:30 pm de la noche, ya que a las 21:00 pm de la noche cierran alg1s negocios, sin embargo el cine esta abierto hasta la 21:00 de la noche"

pat1 = re.compile(rf"(d+[s:]+d+)s*{words}")
pat2 = re.compile(fr"(d+[s:]+d+s*pm)s*{words}")

s = pat1.sub(r"1 pm", s)
s = pat2.sub(r"1", s)
print(s)

Prints:

Tras pasar las horas de la tarde a las 19:30 pm salimos de la casa juntos!! es importante llegar alla antes de las 20:30 pm, ya que a las 21:00 pm cierran alg1s negocios, sin embargo el cine esta abierto hasta la 21:00 pm
Answered By: Andrej Kesely
Categories: questions Tags: , ,
Answers are sorted by their score. The answer accepted by the question owner as the best is marked with
at the top-right corner.