About 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}
...         (.)?
...         ([a-zA-Z]{2,4})?
...         )'''
>>> re.findall(pattern3, msg, re.VERBOSE)
[('txt@deepstone.com.tw', '.', 'tw'), ('kkk@gmail.com', '', '')]

相关内容

  • 没有找到相关文章

最新更新