Python正则匹配两模式间值时连续重复值无法全匹配如何解决
正则匹配连续重复数值失效问题修复方案
问题原因
你的正则表达式会消耗已匹配的字符:当匹配到第一个目标值时,目标值右侧的运算符会被第三个捕获组一同匹配、从待匹配字符串中移除。当两个目标值通过运算符连续连接时(比如20+20中的+),前一次匹配已经把+消耗掉,第二个目标值的左侧就没有符合规则的前缀可供匹配,因此匹配失败。
修复方案
将前后边界替换为零宽断言,这类断言只会做规则校验,不会消耗匹配到的字符,不会影响后续匹配:
import re # 如果不需要保留前后运算符,直接获取所有匹配的目标值 result = re.findall(fr"(?<=[\-\+\*\/\(]|^){re.escape(val)}(?=[\-\+\*\/\)]|$)", equation)
如果需要保留原返回结果的(前缀,目标值,后缀)三元组结构,可以用如下写法:
result = re.findall(fr"([\-\+\*\/\(]|^)({re.escape(val)})(?=([\-\+\*\/\)]|$))", equation)
效果验证
- 测试用例
20+20-5搜索20:第一种写法返回['20', '20'],第二种写法返回[('', '20', '+'), ('+', '20', '-')],符合预期 - 原有正常匹配的用例
20+5-20、5-20*4-20/3匹配结果不受影响
注意事项
加入re.escape(val)是为了避免目标值包含正则特殊字符(比如.、*)时导致匹配规则异常,如果你的搜索值都是纯数字可以省略,建议保留提升兼容性。
内容的提问来源于stack exchange,提问作者RRR
相关产品推荐
相关产品推荐

