Python re.findall()和优先级

时间:2014-08-22 05:31:16

标签: python regex

当我在正则表达式模式中使用嵌套括号来说明优先级时,如何使用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 :(得分: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)

\((\d+)\)

这很有效。参见演示。

http://regex101.com/r/wE3dU7/2