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

正则表达式匹配1-2位数字但排除后续连续多数字的问题

正则替换误匹配修复方案

问题说明

现有Python正则替换代码会误匹配4位及以上连续数字的片段,导致替换结果不符合预期:

原代码

import re

input_text = "del 2065 de 42 52 de 200 de 2222 25 de 25 del 26. o del 8"  # 示例输入

num_pattern = r"(\d{1,2})"
identification_regex = r"(?:del|de[\s|]*el|de|)[\s|]*" + num_pattern

input_text = re.sub(identification_regex, "AA", input_text)

print(repr(input_text)) # --> 输出

错误输出

'AAAA AAAA AAAA AAAAAA AA AA. o AA'

期望输出

"del 2065 AA AA de 200 de 2222 AA AA AA. o AA"

问题核心:原num_pattern会捕获长数字(如2065)中的1-2位片段,导致长数字被错误替换,需添加约束确保只匹配独立的1-2位数字。

解决方案

通过负向断言或单词边界约束数字模式,避免匹配长数字的部分片段:

修改数字匹配模式

将num_pattern替换为以下两种方式之一:

  1. 负向断言(精准约束前后无数字):
num_pattern = r"(?<!\d)\d{1,2}(?!\d)"
  1. 单词边界(适配数字前后有标点的场景):
num_pattern = r"\b\d{1,2}\b"

完整修改后代码

import re

input_text = "del 2065 de 42 52 de 200 de 2222 25 de 25 del 26. o del 8"

# 使用负向断言确保匹配独立的1-2位数字
num_pattern = r"(?<!\d)\d{1,2}(?!\d)"
identification_regex = r"(?:del|de[\s|]*el|de|)[\s|]*" + num_pattern

input_text = re.sub(identification_regex, "AA", input_text)

print(repr(input_text))

约束说明

  • (?<!\d):负向后行断言,确保当前位置前不是数字,避免匹配长数字的末尾片段(如2065的65)
  • (?!\d):负向前行断言,确保当前位置后不是数字,避免匹配长数字的开头片段(如2065的20)
  • \b:单词边界,可识别数字与非单词字符(如.)的边界,同样能避免匹配长数字片段

运行修改后的代码即可得到符合预期的输出。


内容的提问来源于stack exchange,提问作者Matt095

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 19:30:53