关于 re.findall

问题描述

以下是我的python代码

import re

msg = '''txt@deepstone.com.tw kkk@gmail.com'''
pattern = r'''(
        [a-zA-Z0-9_.]+     
        @                           
        [a-zA-Z0-9-.]+      
        \.                           
        [a-zA-Z]{2,4}       
        (\.)?                      
        ([a-zA-Z]{2,4})?  
        )'''
email = re.findall(pattern,msg,re.VERBOSE)
print(email)

我在 python shell 中运行它,得到以下结果:

[('txt@deepstone.com.tw','',''),('kkk@gmail.com','')]

我的问题是为什么第一个元组中的第二个和第三个元素是空的? 我认为第一个元组中的第二个和第三个元素是“。”和“tw”。

我有什么误解吗?

解决方法

@ ([a-zA-Z0-9-.]) 之后的第一个字符类包含字面量 . 并且它是贪婪匹配的,这意味着它会尽可能多地运行,而不是尽快停止可以。

您可以通过非贪婪匹配 ([...]+?) 或删除点来避免这种情况,从而允许正则表达式的其余部分匹配。

代码:

>>> import re
>>> msg = '''txt@deepstone.com.tw kkk@gmail.com'''
>>> pattern2 = r'''(
...         [a-zA-Z0-9_.]+
...         @
...         [a-zA-Z0-9-]+
...         \.
...         [a-zA-Z]{2,4}
...         (\.)?
...         ([a-zA-Z]{2,4})?
...         )'''
>>> re.findall(pattern2,msg,re.VERBOSE)
[('txt@deepstone.com.tw','.','tw'),('kkk@gmail.com','','')]
>>> pattern3 = r'''(
...         [a-zA-Z0-9_.]+
...         @
...         [a-zA-Z0-9-.]+?
...         \.
...         [a-zA-Z]{2,4})?
...         )'''
>>> re.findall(pattern3,'')]