当我在正则表达式模式中使用嵌套括号来说明优先级时,如何使用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)
有没有办法明确处理优先级而不影响结果?
答案 0 :(得分:4)
你可以说外部括号是要匹配的逐字括号字符
>>> print re.findall(r'\((\d+)\)', s)
['12', '23', '34']
>>>
相反,如果你只是在一个平衡的括号中使用表达式来匹配表达式,那么我对你来说就是坏消息:正则表达式语言不够强大(因为那种语法不是常规的#34;)。这不是一个Python实现问题......它是一个即使在理论上也没有用正则表达式解决的问题(换句话说,它不是我们不知道如何解决它......我们知道它无法解决。)
您需要编写显式Python代码来解析任意嵌套的语法(如果您关心嵌套级别)。正则表达式是DFSA无法计数"水平;这需要记忆,至少需要PDA。
答案 1 :(得分: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']
答案 2 :(得分:0)