python正则表达式多次模式匹配到电子邮件

problem

1、 在附件address-7.txt文件中具有如下的格式:

raw = '''<name>Mary Brown</name>
1998.06.01  13031107444  Mary.Brown@hotmail.com 
Room 301, Building 3, 220 Handan Road
<name>John Wilson</name> 
18919819461 
John_W@qq.com 
John_2@sina.com 
1804273611@fudan.edu.cn
@Room 1101, Building 5, No.450, Nanjing Road
<name>Adam Davis</name> 
2000.01.01
310110200001010056x
17100345361 
1-Adam@me.com 
2-Adam@sina.com 
Room 1101, No. 5, Lane 22, Siping Road
<name>Seven Carl</name> 
2010.01.01
310110200001010056x
seven@google.com 
carl@sina.com
'''

(1)每个用户的信息由姓名标识分割
(2)电子邮件地址格式: 用户名@域名.域名[.域名] [a-zA-Z0-9._-]等字符组成,用户名和域名由@相连接,@后面的域名至少有二级域名
分析附件address-7.txt文件里面每个人的电子邮件地址并打印出来(按照姓名升序),如图所示:

analyze

这个问题要用多次正则表达式进行匹配, 第一次匹配姓名

name_partten = r'<name>(.+?)</name>'
names = re.findall(name_partten, raw)
print(names)

第二次匹配夹杂着电子邮件的乱七八糟的信息:

# 匹配email 
raw_info_partten = r'</name>(.*?)<name>'
raw_infos = re.findall(raw_info_partten, processed_raw)
# 注意这里的processed_raw是经过处理的raw, 对raw要去掉换行符,替换为空格, 并且在最后加一个<name>
print(raw_infos)

第三次匹配上一步结果中的email

for raw_info in raw_infos:
	email_partten = r'([a-zA-Z0-9._-]+@[a-zA-Z0-9._]+.[a-zA-Z0-9._]+[.[a-zA-Z0-9._]+]?)'
        # 注意上面可有可无的三级域名要用[]作为一个整体可有可无;()是用来分组的
	emails = re.findall(email_partten, raw_info)
	print(emails)
原文地址:https://www.cnblogs.com/lyzz1314/p/14131443.html