所以我正在练习我的正则表达式,我遇到了这个
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?以及如何修复它?
不要使用lookahead/lookbehind;使用组代替。(我真的希望当我第一次学习正则表达式时有人告诉我这一点!):
re.search('STATE\s+:\s+(\w+)', "STATE : TEXAS").group(1)
Out[145]: 'TEXAS'
Run Code Online (Sandbox Code Playgroud)
考虑一下您的模式的这一部分:
(?<=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)
| 归档时间: |
|
| 查看次数: |
3757 次 |
| 最近记录: |