多重正向回顾正则表达式

Zio*_*ion 1 python regex

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

STATE :   TEXAS
Run Code Online (Sandbox Code Playgroud)

我会积极回顾

这是我的正则表达式:

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

这个正则表达式无法捕获TEXAS

但是如果我这样做:

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

删除第二个积极的lookbehind会给你: TEXAS

但是我想要提取的只是TEXAS没有冒号,为什么后面的第二个查找无法捕获TEXAS?以及如何修复它?

max*_*moo 5

不要使用lookahead/lookbehind;使用组代替。(我真的希望当我第一次学习正则表达式时有人告诉我这一点!):

re.search('STATE\s+:\s+(\w+)', "STATE :   TEXAS").group(1)
Out[145]: 'TEXAS'
Run Code Online (Sandbox Code Playgroud)


Bre*_*arn 5

考虑一下您的模式的这一部分:

(?<=STATE)\s+(?<=:)
Run Code Online (Sandbox Code Playgroud)

第一个lookbehind说要找到一个前面有“STATE”的地方。说\s+要匹配一些空白。第二个lookbehind表示向后查看(查看您刚刚匹配的内容)并找到一个冒号。这是不可能的,因为你匹配的只是空格。在比赛过程中,如果不消耗冒号,你就无法回头找到冒号。

表达式中间的回顾并不意味着“跳过这一部分”。意思是回顾一下已经匹配过的内容,看看它是否与lookbehind表达式相匹配。它只能匹配已经消耗的内容(除非它位于正则表达式的开头,在这种情况下它将控制匹配的开始位置),

如果您只想获取“TEXAS”,则应该将其捕获到一个组中,然后在进行匹配后提取该组:

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