如何让Python的re.sub()仅替换未被数字\d前置的单词'mil'?
解决:用Python re.sub()仅替换无前置数字的独立单词'mil'
需求
仅当独立单词mil前面没有数字时,将其替换为1 mil;需忽略包含mil的其他单词(如millas、milan),以及前面带有数字的mil(如25 mil、2mil)。
测试输入
import re # 示例1 input_str = "esta a mil o a 25 mil 500 millas de la ciudad de milan" # 示例2 input_str = "mil o mas para pasar! y tu tienes menos de mil" # 示例3 input_str = "hace casi mil o 2mil anos aparecio un fenomeno legendario tan solo a millas de aqui"
错误代码(无法满足需求)
input_str = re.sub(r"\d[\s|]*(?:mil)", " 1 mil" , input_str)
问题:该正则匹配的是有数字前置的
mil,与需求完全相反,且未处理单词边界,无法区分独立mil和含mil的其他单词。
期望输出
# 示例1输出 "esta a 1 mil o a 25 mil 500 millas de la ciudad de milan" # 示例2输出 "1 mil o mas para pasar! y tu tienes menos de 1 mil" # 示例3输出 "hace casi 1 mil o 2mil anos aparecio un fenomeno legendario tan solo a millas de aqui"
正确实现
import re # 处理单个输入 input_str = "esta a mil o a 25 mil 500 millas de la ciudad de milan" output_str = re.sub(r'(?<!\d)\b(mil)\b', r'1 \1', input_str) print(output_str) # 批量验证所有示例 test_cases = [ "esta a mil o a 25 mil 500 millas de la ciudad de milan", "mil o mas para pasar! y tu tienes menos de mil", "hace casi mil o 2mil anos aparecio un fenomeno legendario tan solo a millas de aqui" ] for idx, case in enumerate(test_cases, 1): result = re.sub(r'(?<!\d)\b(mil)\b', r'1 \1', case) print(f"\n示例{idx}处理结果:") print(result)
正则逻辑说明
(?<!\d):负向后行断言,确保mil前面没有数字字符\b:单词边界,保证只匹配独立的mil单词,排除millas、milan这类包含mil的词(mil):捕获组,替换时通过\1引用原单词,生成1 mil的结果
内容的提问来源于stack exchange,提问作者Matt095
相关产品推荐
相关产品推荐

