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)