查找包含电子邮件地址的所有行

时间:2018-10-26 22:16:07

标签: python regex email line

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

示例,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

我做错了什么?

2 个答案:

答案 0 :(得分:1)

您的正则表达式以^(字符串开头的锚点)开头,以$(字符串结尾的锚点)结尾,这意味着电子邮件地址必须是整行,并带有正则表达式要匹配的就行了。您还使用[A-Z]而不是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替换这些字符。

答案 1 :(得分:0)

使用正则表达式,您可以使用如下代码:

result = [] 
for line in emaillines:
    if re.search (r'[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,10}', line) is not None:
        result.append(line)

正则表达式的问题是:

  • [A-Z]仅匹配大写字母
  • 一开始的插入符号是错误的
  • 您正在使用$
  • 强制将电子邮件放在行尾

我还将功率从{2,63}更改为{2,10}。您允许某人在点后最多输入63个字母。不过,也许这是故意的,在这种情况下,应将其更改。

此外,您可以将正则表达式缩短为:

r'[\w.%+-]+@[a-zA-Z\d.-]+\.[a-zA-Z]{2,10}'