import re, datetime
#Ejemplos en donde si se debe hacer uno o mas reemplazos
input_text = "Decian muchas cosas; Seguro eso ocurrira despues de 3 dias"
input_text = "seguro eso ocurrira despues de 3 dias.\n empieza el 2021-11-12"
input_text = "Recien el 2021-10-12; seguro eso ocurrira despues de 3 dias."
#Ejemplos en donde no se deberia hacer ningun reemplazo
input_text = "seguro eso ocurrira despues de 3 dias. empieza el 2021-11-12"
input_text = "Recien el 2021-10-12, seguro eso ocurrira despues 3 dias."
#operation function ( ([12]\d{3}-[01]\d-[0-3]\d)(\D*?), (\d+) , "add" )
def add_or_subtract_days(datestr, days, operation):
today = datetime.date.today()
if operation == "add" : x = (datetime.datetime.strptime(today, "%Y-%m-%d") + datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')
elif operation == "subtract" : x = (datetime.datetime.strptime(today, "%Y-%m-%d") - datetime.timedelta(days=int(days))).strftime('%Y-%m-%d')
return x
some_text = r"[\s|]*"
input_text = re.sub(r"(?:([12]\d{3}-[01]\d-[0-3]\d)(\D*?)|)" + some_text + r"(?:(?:pasados|pasado|despues del|despues de el|despues de|despues|tras) (\d+) (?:días|día|dias|dia)|(\d+) (?:días|día|dias|dia) (?:pasados|pasado|despues del|despues de el|despues de|despues|tras))" + some_text + r"(?:([12]\d{3}-[01]\d-[0-3]\d)(\D*?)|)",
lambda m: print(m[3]) ,
#lambda m: add_or_subtract_days( m[1] or m[4] , m[2] or m[3] , "add" ),
input_text)
print("output: " + repr(input_text)) # ---> output
You should only perform the replace only if there is at least one ";"
or ".\n"
between "(pasado|despues|tras) n (dias|dia)"
and the date "\d*-\d{2}-\d{2}"
output that I need (today = 2022-12-13):
"Decian muchas cosas; Seguro eso ocurrira 2022-12-16"
"seguro eso ocurrira 2022-12-16.\n empieza el 2021-11-12"
"Recien el 2021-10-12; seguro eso ocurrira despues de 2022-12-16."
In this last two examples no replacement is made since there is no ; or \n. in the middle of the capture groups
"seguro eso ocurrira despues de 3 dias. empieza el 2021-11-12"
"Recien el 2021-10-12, seguro eso ocurrira despues de 3 dias."