繁体   English   中英

Python re.findall()和优先级

[英]Python re.findall() and precedence

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

有什么方法可以显式处理优先级而不影响结果吗?

您可以说外部括号是要匹配的逐字括号字符

>>> print re.findall(r'\((\d+)\)', s)
['12', '23', '34']
>>>

相反,如果您仅在匹配表达式位于平衡的括号内时才讨论匹配,那么我对您来说是个坏消息:正则表达式语言不够强大(因为这种语法不是“正则”) 。 这不是Python的实现问题……这是一个即使在理论上也不能使用正则表达式解决的问题(换句话说,这不是我们不知道如何解决它……我们知道它无法解决)。

您需要编写显式Python代码来解析任意嵌套的语法(如果您关心嵌套级别)。 正则表达式是DFSA无法“计算”级别; 这需要记忆和至少一个PDA。

你不需要捕捉任何东西。 只需在正则表达式中使用正面的后视和前瞻,

>>> 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']
\((\d+)\)

这有效。请参见演示。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM