多个正面Lookbehind正则表达式

时间:2015-07-31 06:14:48

标签: python regex

所以我正在练习我的正则表达式而且我遇到了这个

STATE :   TEXAS

我正在寻找积极的外观

这是我的正则表达式:

state = re.search(r"(?<=STATE)\s+(?<=:)\s+\w+",str(Text),re.I|re.M)

此正则表达式无法捕获TEXAS

然而,如果我这样做:

state = re.search(r"(?<=STATE)\s+:\s+\w+",str(Text),re.I|re.M)

删除第二个正面的lookbehind会给你: TEXAS

然而,我想要提取的是TEXAS而没有冒号为什么第二次看后面无法捕获TEXAS?以及如何解决?

2 个答案:

答案 0 :(得分:4)

想想你的模式的这一部分:

(?<=STATE)\s+(?<=:)

第一个外观说是找到一个地方&#34; STATE&#34;就在它之前。 \s+表示匹配某些空格。第二个外观说是向后看(你刚刚匹配的东西)并找到一个冒号。这是不可能的,因为你所匹配的只是空格。你不能回头找一个冒号,而不会在比赛中消耗它。

在你的表达中间留守并不意味着&#34;跳过,直到你超越这部分&#34;。这意味着回顾已经匹配的内容并查看它是否与lookbehind表达式匹配。它只能匹配已经消耗的东西(除非它在正则表达式的开头,它将控制匹配开始的位置),

如果您只想获得&#34; TEXAS&#34;,您应该在一个组中捕获它,然后在完成匹配后提取该组:

>>> data = "STATE :   TEXAS"
>>> re.search("STATE\s+:\s+(\w+)", data).group(1)
'TEXAS'

答案 1 :(得分:2)

不要使用前瞻/后视;而是使用组。 (当我第一次学习正则表达式时,我真的希望有人告诉过我!):

re.search('STATE\s+:\s+(\w+)', "STATE :   TEXAS").group(1)
Out[145]: 'TEXAS'
相关问题