如何在Lambda函数中加入条件判断实现字符串单复数拼接?
解决Python正则替换中天数单复数的问题
问题说明
现有一段Python代码,通过re.sub结合Lambda函数将文本中的X semana/semanas转换为X×每周天数 dias,但当前Lambda函数无论计算后的天数是多少,都只会拼接复数形式的dias,无法根据数值自动切换单数dia或复数dias。
原代码(注意:原代码缺失re模块导入,需补充):
import re 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函数内部加入条件判断,基于计算后的总天数来决定使用单数还是复数形式(注:原需求中给出的判断原周数的逻辑存在漏洞,比如当每周天数为2时,1周对应2天,此时应该用复数dias,而非单数dia,因此正确逻辑应基于总天数判断)。
修正后的代码:
import re def weeks_to_days(input_text, nro_days_in_a_week = 7): input_text = re.sub( r"(\d+)\s*(?:semanas|semana)", # 简化正则,仅匹配空格(若需保留竖线可改回[\s|]*) lambda m: f"{total_days} dia " if (total_days := int(m[1]) * nro_days_in_a_week) == 1 else f"{total_days} 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" # 测试默认每周7天的情况 print(weeks_to_days(input_text)) # 输出: en 7 dias quizas este lista, aunque viendole mejor, creo esta muy oxidada y seguro la podre poner en marcha en 21 dias # 测试每周1天的情况 print(weeks_to_days(input_text, nro_days_in_a_week=1)) # 输出: en 1 dia quizas este lista, aunque viendole mejor, creo esta muy oxidada y seguro la podre poner en marcha en 3 dias
关键细节
- 利用Python 3.8+支持的海象运算符
:=,在Lambda函数内一次性计算并存储总天数,简化条件判断 - 核心逻辑:总天数为1时用单数
dia,其余情况用复数dias - 优化正则表达式:将
[\s|]简化为\s*(若需匹配空格或竖线可改回[\s|]*),避免字符集内不必要的转义
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

