【问题标题】:regex using python language使用python语言的正则表达式
【发布时间】:2019-07-26 21:24:41
【问题描述】:

我有一个包含各种电子邮件地址和其他无效电子邮件行的 txt 文件,我试图只打印有效的电子邮件地址,当我使用下面的代码时,没有打印任何内容。 这是txt文件的内容:

blbabal@gmail.com   
hey@gmail.com

lalalalal

在这种情况下,只应打印两个电子邮件地址

 import re

    my_file = open('emails.txt', 'r+')

【问题讨论】:

  • 添加re.M标志,re.findall(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.-]+$", my_file.read(), re.M)
  • 这与这个问题非常相似:stackoverflow.com/q/6186938/4636715 除了您专门寻找电子邮件地址。但是由于您的观点不是您构建的正则表达式,因此可以将其视为骗局。
  • @vahdet 这与那个问题不相似。在这里,整行必须匹配一个模式。
  • 没有打印任何内容,因为for 循环正在遍历文件,该文件已经使用.read() 搜索到末尾。你为什么不迭代 items 呢?
  • 您正在寻找匹配项,将它们存储在 items 中,并且在下一行您将覆盖 items

标签: python regex email


【解决方案1】:

这应该打印文件中的所有电子邮件

import re
reg = '[A-Za-z0-9.]+@[A-Za-z0-9]+[.][a-z]+'
with open('email.txt', 'r') as f1:
    for email in f1:
        if(len(re.findall(reg,email))!=0):
            print(email)

这应该只收到整行电子邮件 -

import re
reg = '[A-Za-z0-9.]+@[A-Za-z0-9]+[.][a-z]+'
with open('email.txt', 'r') as f1:
    for email in f1:
        if(len(re.findall(reg,email))):
            if(len(re.findall(reg,email)[0])==len((email.replace("\n","")))):
                print(email)

【讨论】:

  • OP 只想要那些等于整行的电子邮件。
  • 检查代码的第二部分,该部分将获取仅包含整个电子邮件的行。
  • 有一个更直接的方法,看我的回答。
【解决方案2】:
import re
my_file = open('emails.txt', 'r+')
items = re.findall(r"([a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+)", my_file.read())
for items in items:
    print(items)

两个问题

  1. 用于项目而不是文件中的项目
  2. 从您的模式中删除 ^ 和 $。

【讨论】:

  • 如果您删除锚点,电子邮件之类的不等于整行的子字符串也将被提取。 OP 使用锚点是有原因的。
【解决方案3】:

如果您添加re.M 标志,您可以修复您的代码:

re.findall(r"^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.-]+$", my_file.read(), re.M)

由于您使用my_file.read() 读取整个文件,因此^$ 应该匹配 的开始/结束,而不是字符串,并且re.M 标志就是这样做的。

此外,您可以逐行读取文件,只获取与您的模式完全匹配的行:

items = []
email_rx = re.compile(r"[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9.-]+$")
with open('emails.txt', 'r+') as my_file:
    for line in my_file:
        if email_rx.match(line):
            items.append(line)

请注意,只有 $ 锚是必需的,因为 re.match 仅需要 anchors matches at the start of the string

请注意,您可能有 CRLF 结尾,那么,您可以在针对正则表达式进行测试之前将每行 rstrip 附加到 items,或者在 $ 锚点之前的末尾添加 \s* 模式。

【讨论】:

    猜你喜欢
    • 2016-12-14
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 2011-01-31
    • 2013-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多