《python3廖雪峰》正则表达式匹配Email地址练习题答案

时间:2022-09-24 09:16:21

《python3廖雪峰》正则表达式匹配Email地址练习题答案

《python3廖雪峰》正则表达式章节最后留了这个题目,对于初学者还是要折腾一下才能做出来的,我作为初学者,花了1个小时研究出来了,当然只是针对题目中的3种Email地址的正则匹配,如果想写出通用的Email地址正则表达式,就太复杂也没必要了。

先贴上代码,后面再讲解下:

import re

regex = r'^(<\w[\s\w]+>\s)?(\w+[\w+.]*@\w+.(org|com)$)'
# 题目一:正则匹配
m = re.compile(regex)
# 纯Email地址
if m.match('someone@gmail.com'):
print('match someone@gmail.com')
if m.match('bill.gates@microsoft.com'):
print('match bill.gates@microsoft.com')
# 带名字的Email地址
if m.match('<Tom Paris> tom@voyager.org'):
print('match <Tom Paris> tom@voyager.org')
# 题目二:提取带名字的Email地址
m_email = m.match('<Tom Paris> tom@voyager.org').group(2)
print(m_email)

输出结果:

《python3廖雪峰》正则表达式匹配Email地址练习题答案

讲解:

1.要同时匹配以上3种地址,就要充分考虑共同性,很容易发现第3个地址前面多了“<Tom Paris> ”,注意后面还有一个空格!因此这部分出现0次或1次,也就是(<\w[\s\w]+>\s)?的意义。\w匹配Tom,\s匹配空格,[\s\w]+匹配“ Paris”。最后一个空格用\s匹配。

2.然后就是Email地址本身了。观察知道,第2个其实是包含了第1个地址的,\w+匹配第1个单词不用说了,[\w+.]*匹配后面的单词和小数点,然后是@符号,后面的一样,最后以.com或.org结束,结束符$,开始符^。

3.匹配完了,就是分组提取了。题目要求提取出带名字的Email地址,因此分两组,第1组是前面的名字(<\w[\s\w]+>\s)?,第2组是Email地址(\w+[\w+.]*@\w+.(org|com)$),然后是用re.match的group方法提取出第2个分组。

<span style="font-size:18px;"><strong>虽然做出来了,但是个人感觉这个正则还是有点冗余,然后大神们可以在评论中提出修改意见。</strong></span>