首页 > 解决方案 > 当值是连续的时,两个模式之间的值的正则表达式匹配不会返回所有实例

问题描述

我试图在一个方程中找到一个数字的所有实例。为此,我编写了这个 python 脚本:

re.findall(fr"([\-\+\*\/\(]|^)({val})([\-\+\*\/\)]|$)", equation)

现在,当我给它 this:20+5-20并搜索 时20,输出与预期的一样:[('', '20', '+'), ('-', '20', '')] 但是,当我简单地这样做时20+20-5,它不再起作用,我只得到第一个实例:[('', '20', '+')]

我不明白为什么,它甚至20不是在开始和结束的问题,例如,这仍然会很好地5-20*4-20/3匹配。20当值连续重复时它不起作用

我该如何解决?

谢谢

标签: pythonregex

解决方案


您的模式最初不起作用的原因20+20-5是匹配第一次出现 20 后的字符类实际上消耗了+

消费后,对于紧随其后的第二次出现的 20,这部分模式[\-\+\*\/\(]|^)无法匹配,因为没有与字符类匹配的字符,并且它不在字符串的开头。

例如,在{val}您的位置使用 20 可以使用环视,它不会消耗该值,而只会断言它存在。

请注意,您不必转义字符类中的值,并且对于最后一个断言,您不必添加另一个非捕获组。

(?:(?<=[-+*/(])|^)20(?=[-+*/)]|$)

正则表达式演示

import re

strings = [
    "20+5-20",
    "20+20-5"
]
val = 20
pattern = fr"(?:(?<=[-+*/(])|^){val}(?=[-+*/)]|$)"

for equation in strings:
    print(re.findall(pattern, equation))

输出

['20', '20']
['20', '20']

推荐阅读