python找出一串字符中所有的email

#coding=utf-8
import re
email_re = re.compile(
    r"(([-!#$%&'*+/=?^_`{}|~0-9A-Z]+(\.[-!#$%&'*+/=?^_`{}|~0-9A-Z]+)*"  # dot-atom
    r'|^"([\001-\010\013\014\016-\037!#-\[\]-\177]|\\[\001-011\013\014\016-\177])*"' # quoted-string
    r')@(?:[A-Z0-9]+(?:-*[A-Z0-9]+)*\.)+[A-Z]{2,6})', re.IGNORECASE)  # domain

email_str = u"[email protected]  QQ:87590067 MSN:[email protected]"

email_list = []

for one in email_re.findall(email_str):
    email_list.append(one[0]) 

print email_list


结果:[u'[email protected]', u'[email protected]']

其中email_re为django源码中匹配email地址的正则表达式

注:
区分group,groups,findall:

group()即默认情况, 是返回的整个表达式所匹配的,group(1)是返回子组1(其实就是第一个括号里的表达式)所匹配的,类似的group(2)是子组2匹配的,为了方面记忆,可以用命名组 (?P<name>...) 匹配时用group(name)即可

而groups()返回的是一个元组,包括所有子组所匹配的 如 (子组1,子组2,...)

而findall()返回的是一个列表,他的第一个元素其实就是groups()返回的元组

一个简单的例子:

>>> re.search('(a(\d))','a342a1').group(0,1,2)
('a3', 'a3', '3')
>>> re.search('(a(\d))','a342a1').groups()
('a3', '3')
>>> re.findall('(a(\d))','a342a1')
[('a3', '3'), ('a1', '1')]

你可能感兴趣的:(python,正则表达式,django,qq)