python - 当值是连续的时,两个模式之间的值的正则表达式匹配不会返回所有实例
问题描述
我试图在一个方程中找到一个数字的所有实例。为此,我编写了这个 python 脚本:
re.findall(fr"([\-\+\*\/\(]|^)({val})([\-\+\*\/\)]|$)", equation)
现在,当我给它 this:20+5-20
并搜索 时20
,输出与预期的一样:[('', '20', '+'), ('-', '20', '')]
但是,当我简单地这样做时20+20-5
,它不再起作用,我只得到第一个实例:[('', '20', '+')]
我不明白为什么,它甚至20
不是在开始和结束的问题,例如,这仍然会很好地5-20*4-20/3
匹配。20
当值连续重复时它不起作用
我该如何解决?
谢谢
解决方案
您的模式最初不起作用的原因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']
推荐阅读
- php - php excel为多维数组创建excel
- laravel - 雄辩的搜索与两个表不完全工作?
- android - Retrofit 2 处理动态错误
- mysql - 我可以通过 SSH 隧道使用 Navicat 连接到 mysql,但无法使用 shell 或 java 连接
- jsp - 缓存控制代码不适用于 jsp 中的发布请求
- spring - 无法编写 JSON:找不到类型类 com.gk.promo.models.location.Location 的 PersistentEntity
- mysql - AIX 7.1 上的 MYSQL 5.7 安装
- docker - Docker Swarm 故障转移
- python - Python:requests.session 没有保持连接活跃
- php - 通过referrer http请求重定向wordpress主页