Python re.findall() 和优先级
我该如何使用re.findall()函数来获取一个匹配实例的列表,当我在正则表达式模式中使用嵌套括号来考虑优先级时?
举个例子:
import re
string = 'blah blah 12234 (12) (23) (34)'
print re.findall(r'\((\d)+)\)', string)
这段代码输出:
[('12', '2'), ('23', '3'), ('34', '4')]
而不是预期的结果
['12', '23', '34']
当然,在这种情况下,可以通过简单地更改内部括号来修复这个问题:
print re.findall(r'\((\d+)\)', string)
有没有什么方法可以明确处理优先级,而不影响结果呢?
3 个回答
0
3
你不需要去捕捉任何东西。只要在你的正则表达式中使用正向回顾和正向前瞻就可以了。
>>> import re
>>> string = 'blah blah 12234 (12) (23) (34)'
>>> print re.findall(r'(?<=\()\d+(?=\))', string)
['12', '23', '34']
你需要把+
放在捕获组里面。
>>> print re.findall(r'\((\d+)\)', string)
['12', '23', '34']
4
你可以理解为外面的括号就是要匹配的括号字符。
>>> print re.findall(r'\((\d+)\)', s)
['12', '23', '34']
>>>
如果你想说的是只有在一对平衡的括号里面才匹配某个表达式,那我得告诉你一个坏消息:正则表达式的语言能力不够,无法做到这一点(因为这种语法不是“正则”的)。这不是Python实现的问题……这是一个连理论上都无法用正则表达式解决的问题(换句话说,我们知道怎么解决,但我们知道这是不可能的)。
你需要写一些明确的Python代码来解析任意嵌套的语法(如果你在意嵌套的层级)。正则表达式是无法“计数”层级的,它们是有限状态自动机;这需要内存,至少需要一个下推自动机。