在跟着廖雪峰老师的教程学习python正则表达式,利用正则表达式进行匹配邮箱名字时,利用match.group(1)函数遇到了下面的问题:
Traceback (most recent call last):
File "C:\Users\17548\Workspace\EmailZhengze.py", line 27, in <module>
name_of_email_1('<Tom Paris> tom@voyager.org')=='Tom Paris'
File "C:\Users\17548\Workspace\EmailZhengze.py", line 25, in name_of_email_1
return m1.group(1)
AttributeError: 'NoneType' object has no attribute 'group'
我要解决的问题:
提取带名字的Email地址,之后用assert进行检验,看是否匹配成功
原代码如下:
def name_of_email(addr):
return re.match(r'<?([a-zA-Z\s]+)>?\s?(\w?)@(\w+).(\w+)',addr).group(1)
#测试
assert name_of_email('<Tom Paris> tom@voyager.org') == 'Tom Paris'
assert name_of_email('tom@voyager.org') == 'tom'
print('ok')
正确答案:
def name_of_email(addr):
return re.match(r'<?([a-zA-Z\s]+)>?\s?(\w*)@(\w+).(\w+)',addr).group(1)
做法:直接将\s?(\w?)-------->\s(\w*)
错在哪里?
1、主要思路:以<Tom Paris> tom@voyager.org为模板进行正则表达式匹配,接着对所写的正则表达式进行修改,以能够同时匹配第二个邮箱。
2、开始想的是先检测<>是否存在,如果存在好搞,就直接在后面进行匹配多个字母,这里使用(),以便之后提取名字时使用。在<Tom Paris> tom@voyager.org中<>后面还有字母tom,但是在后一个邮箱中就只有多个字母组成的字符串,@前面的字符串就是这个邮箱的名字,于是我就对后的这个(\w?)用了?,因为想着可能有也可能没有...是嘛
3、最后在看正则表达式的时候,就恍然大悟,这个字母的个数可以设置为任意个,既有,又没有。问题就这样解决了。
总结
如果觉得不对劲就多把这几个符号试一试,或许就能够明白这其中的道理了。(现在终于掌握住啦
*是有任意个(可以是0个
?是有一个或者没有