Python 正则表达式:回溯引用匹配的分组

0 投票
2 回答
611 浏览
提问于 2025-04-17 17:36

我正在尝试从我的正则表达式匹配中返回两个子组:

email_add = "John@Doe.com <John@Doe.com>"
m = re.match(r"(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b) <(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)", email_add)

但是它似乎没有匹配成功:

>>> m.group()
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'NoneType' object has no attribute 'group'

我怀疑我可能没有正确分组,或者我使用了错误的单词边界。我试过用 \w 代替 \b,但结果还是一样。

有人能帮我指出我的错误吗?

2 个回答

2

你的正则表达式的问题已经被指出了,但你可能还想考虑一下 email.utils.parseaddr 这个方法:

>>> from email.utils import parseaddr
>>> email_add = "John@Doe.com <John@Doe.com>"
>>> parseaddr(email_add)
('', 'John@Doe.com')  # doesn't get first part, so could assume it's same as 2nd?
>>> email_add = "John Doe <John@Doe.com>"
>>> parseaddr(email_add)
('John Doe', 'John@Doe.com') # does get name and email
2

你只是在匹配大写字母 A-Z,所以像 ohnoecom 这些字符组合就无法匹配到任何东西。

如果你加上 re.I 这个不区分大小写的标志,你的匹配模式就能正常工作了:

>>> import re
>>> email_add = "John@Doe.com <John@Doe.com>"
>>> re.match(r"(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b) <(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)", email_add)
>>> re.match(r"(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b) <(\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b)", email_add, re.I)
<_sre.SRE_Match object at 0x1030d4f10>
>>> _.groups()
('John@Doe.com', 'John@Doe.com')

或者你也可以在字符类中加上 a-z

>>> re.match(r"(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b) <(\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}\b)", email_add)
<_sre.SRE_Match object at 0x1030d4f10>
>>> _.groups()
('John@Doe.com', 'John@Doe.com')

撰写回答