使用反向引用的正则表达式在re.match中无法工作

7
以下是Python代码:
import re

line="http://google.com"
procLine = re.match(r'(?<=http).*', line)
if procLine.group() == "":
    print(line + ": did not match regex")
else:
    print(procLine.group())

无法成功匹配,输出以下错误信息:

Traceback (most recent call last): File "C:/Users/myUser/Documents/myScript.py", line 5, in if procLine.group() == "": AttributeError: 'NoneType' object has no attribute 'group'

当我用 .* 替换正则表达式时,它可以正常工作,这表明正则表达式存在错误。然而,在 https://regex101.com/ 上测试我的 Python 语法的正则表达式和字符串似乎匹配良好。

有什么想法吗?


2
您可能想使用 search 函数,可以查看文档: "请注意,以正面回顾断言开头的模式无法匹配正在搜索的字符串的开头;您最好使用 search() 函数而不是 match() 函数"。 - niemmi
1个回答

10

如果你将你的回顾表达式转换为一个非捕获组,那么这应该可以工作:

In [7]: re.match(r'(?:http://)(.*)', line)
Out[7]: <_sre.SRE_Match object; span=(0, 17), match='http://google.com'>

In [8]: _.group(1)
Out[8]: 'google.com'

回溯引用无法正常工作的原因是,正如Rawing提到的那样re.match从字符串开头开始查找,所以在字符串开头使用回溯引用是没有意义的。


如果您坚持要使用回溯引用,请改用re.search

In [10]: re.search(r'(?<=http://).*', line)
Out[10]: <_sre.SRE_Match object; span=(7, 17), match='google.com'>

In [11]: _.group()
Out[11]: 'google.com'

谢谢,这个方法确实有效,我会将其作为解决方法使用。但是我暂时不会将其标记为正确答案,以便查看是否有人知道为什么我的后顾断言似乎无法正常工作。 - Lost Crotchet
@LostCrotchet 这是因为match在字符串的_开头_应用正则表达式。在字符串开头进行后顾查找永远不起作用。 - Aran-Fey
1
@cᴏʟᴅsᴘᴇᴇᴅ 前进吧。我认为,每当有人发布评论而不是答案时,他们都在暗示着你可以使用它 :) - Aran-Fey
@LostCrotchet,提醒您查看此帖。 - cs95
你知道我怎么使用回顾后发吗? - Lost Crotchet
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接