【问题标题】:find all lines that contains an email address查找包含电子邮件地址的所有行
【发布时间】:2019-03-31 16:44:39
【问题描述】:

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

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

我做错了什么?

【问题讨论】:

    标签: python regex email line


    【解决方案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

    【讨论】:

      【解决方案2】:

      使用正则表达式,你可以这样使用:

      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}'
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2022-12-01
        • 1970-01-01
        • 1970-01-01
        • 2016-02-21
        • 1970-01-01
        • 1970-01-01
        • 2013-05-01
        • 1970-01-01
        相关资源
        最近更新 更多