使用正则表达式验证Python/Django中的姓名和电子邮件<email@example.com>

1 投票
1 回答
1293 浏览
提问于 2025-04-17 06:15

我想知道怎么才能验证一个完整的电子邮件地址,同时还要包含名字(可以选择性地加上姓氏或者多个姓氏)。

比如说,像“John Doe <john@doe.org>”或者“Jane <jane@doe.org>”这样的格式都应该是有效的,而如果缺少名字,比如“<jane@doe.org>”就不算有效。

我在用Django,所以用Python的正则表达式就可以了,但我没有找到Django里自带的这种验证工具……

谢谢!

补充说明一下问题,我该怎么让这个:

regex=re.compile('^(?P<name>[\w ]+)<(?P<email>[^ ]+@[^.]+\.[\w.]+)>$', re.UNICODE)

regex.match('José Peréz <jose.perez@example.com>')

匹配呢?re.UNICODE并没有解决问题。上面的代码只匹配到“Jose Perez”。

1 个回答

1

我假设在开始的时候并不知道名字,所以我不会尝试用正则表达式来匹配(也就是检查提供的名字和邮箱中@符号前的字符是否相同)。

>>> import re
>>> name_email_matcher = re.compile('^(?P<name>[A-Za-z ]+)<(?P<email>[^ ]+@[^.]+\.[\w.]+)>$')
>>> inp = 'John <john@doe.org>'
>>> inp2 = '<jane@doe.org>'
>>> print (name_email_matcher.match(inp) is not None)
True
>>> print (name_email_matcher.match(inp2) is not None)
False

修改名字的字符类别,让它不仅仅接受字母和空格。邮箱的部分也是根据你的问题设计的。

你可以用同样的正则表达式提取名字和邮箱,方法如下:

>>> match = name_email_matcher.search(inp)
>>> if match is not None:
...     print match.group('name')
...     print match.group('email')
John
john@doe.org

撰写回答