python正则表达式错误(AttributeError: 'NoneType' object has no attribute 'group')-----「*」与「?」的使用出错

 在跟着廖雪峰老师的教程学习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个

?是有一个或者没有

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值