首页 > 解决方案 > 查找包含电子邮件地址的所有行

问题描述

我尝试保存包含电子邮件地址的文件中的所有行。

例如,file.txt:

Lorem ipsum dolor email1@mail.com sit amet,
consectetur adipiscing elit
sed do eiusmod tempor incididunt ut labore
et dolore magna aliqua. Ut enim ad minim veniam
email2@gmail.com quis nostrud exercitation ullamco
laboris nisi ut aliquip ex ea commodo consequat.
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur.
Excepteur sint occaecat cupidatat
non proident email3@yahoo.com
sunt in culpa qui officia deserunt mollit anim id est laborum.

从 file.txt 我只想保存以下行:

Lorem ipsum dolor email1@mail.com sit amet,
email2@gmail.com quis nostrud exercitation ullamco
non proident email3@yahoo.com

我尝试了一些东西,但正则表达式让我很头疼:(

import re


def saveresults(var):
    with open("email-lines.txt", 'a') as target:
        target.write(var+ '\n')
    target.close()
    print " line writed: ", var

file = "test.txt"

emaillines = [linie.rstrip('\n') for linie in open(file)]

for i in emaillines:
    a = re.findall(r"(^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,63}$)", i)
    print a

我做错了什么?

标签: pythonregexemailline

解决方案


您的正则表达式以^(start-of-string anchor) 开头并以$(end-of-string anchor) 结尾,这意味着电子邮件地址必须是整行,并且该行没有其他内容,以便正则表达式匹配。您也在使用[A-Z]but not a-z,并且您没有使用不区分大小写的标志,这意味着电子邮件地址中的小写字母将不起作用。

改成:

pattern = re.compile(r"(?i)[\w.%+-]+@[a-z\d.-]+\.[a-z]{2,63}")
for i in lines:
    if pattern.search(i):
        print(i)

(?i)使正则表达式不区分大小写,并且包含的​​字符集意味着这些字符在大多数情况下[0-9A-Za-z_]都可以替换为。\w


推荐阅读