所以我正在练习我的正则表达式而且我遇到了这个
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
?以及如何解决?
答案 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'