You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.19 07:40:36