regex 如何在lambda函数中添加if条件来确定哪个字符串连接到另一个字符串?

gudnpqoy  于 2022-12-19  发布在  其他
关注(0)|答案(1)|浏览(136)
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))

这个lambda函数的问题在于,不管有多少个"dias",它总是将"dias"作为复数。
如何将条件放入lambda函数中,以根据数量确定它是复数形式的"dias"还是单数形式的"dia"

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 "

从示例中获取该字符串,我们应该得到以下输出:

"en 7 dias quizas este lista, aunque viendole mejor, creo esta muy oxidada y seguro la podre poner en marcha en 21 dias"

在这种情况下,因为它们是周,所以它们将始终保持复数形式,但假设周持续1天作为参数,那么问题就存在了。

kt06eoxx

kt06eoxx1#

您可以使用

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))

正则表达式现在是(\d+(?:\.\d+)?)\s*semanas?\b

  • (\d+(?:\.\d+)?)-第1组:一个或多个数字,后跟.和一个或多个数字的可选序列
  • \s*-零个或多个空格
  • semanas?-semana和一个可选的s字符
  • \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")替换现在连接:

  • str(int(float(m[1]) * nro_days_in_a_week))-第1组乘以nro_days_in_a_week的天数
  • 如果组1值与nro_days_in_a_week相乘的结果四舍五入为1,则(" dia" if round(float(m[1]) * nro_days_in_a_week) == 1 else " dias")dia相加,否则使用dias

相关问题