def weeks_to_days(input_text, nro_days_in_a_week = 7):
input_text = re.sub(
r"(\d )[\s|]*(?:semanas|semana)",
lambda m: str(int(m[1]) * nro_days_in_a_week) " dias ",
input_text)
return input_text
input_text = "en 1 semana quizas este lista, aunque viendole mejor, creo esta muy oxidada y seguro la podre poner en marcha en 3 semanas"
print(weeks_to_days(input_text))
The problem with this lambda function is that it always puts "dias"
in the plural no matter how many.
How do I place this conditional inside the lambda function to determine if it is "dias"
in the plural or if it is "dia"
in the singular depending on the amount
if (str(m[1]) != "1"): str(int(m[1]) * nro_days_in_a_week) " dias "
elif (str(m[1]) == "1"): str(int(m[1]) * nro_days_in_a_week) " dia "
Taking that string from the example, we should get this output:
"en 7 dias quizas este lista, aunque viendole mejor, creo esta muy oxidada y seguro la podre poner en marcha en 21 dias"
In this case, since they are weeks, they will always remain in the plural, but assuming that the week lasts 1 day as a parameter, then the problem would be there.
CodePudding user response:
You can use
import re
def weeks_to_days(input_text, nro_days_in_a_week = 7):
input_text = re.sub(
r"(\d (?:\.\d )?)\s*semanas?\b",
lambda m: str(int(float(m[1]) * nro_days_in_a_week)) (" dia" if round(float(m[1]) * nro_days_in_a_week) == 1 else " dias"),
input_text)
return input_text
input_text = "en 0.142858 semanas quizas este lista, aunque viendole mejor, creo esta muy oxidada y seguro la podre poner en marcha en 3 semanas"
print(weeks_to_days(input_text))
The regex is now (\d (?:\.\d )?)\s*semanas?\b
:
(\d (?:\.\d )?)
- Group 1: one or more digits followed with an optional sequence of a.
and one or more digits\s*
- zero or more whitespacessemanas?
-semana
and an optionals
char\b
- a word boundary.
The lambda m: str(int(float(m[1]) * nro_days_in_a_week)) (" dia" if round(float(m[1]) * nro_days_in_a_week) == 1 else " dias")
replacement now concatenates:
str(int(float(m[1]) * nro_days_in_a_week))
- the number of days that is the Group 1 multiplied by thenro_days_in_a_week
(" dia" if round(float(m[1]) * nro_days_in_a_week) == 1 else " dias")
addsdia
if the result of Group 1 value andnro_days_in_a_week
multiplication is rounded to 1, else,dias
is used.