【问题标题】:Extract e-mail addresses from .txt files in python从python中的.text文件中提取电子邮件地址
【发布时间】:2018-01-08 16:03:13
【问题描述】:

我想用 Python 从几个文本文件中解析出电子邮件地址。在第一次尝试中,我尝试从字符串列表 ('2To whom correspondence should be addressed. E-mail: joachim+pnas@uci.edu.\n') 中获取包含电子邮件地址的以下元素。

当我尝试通过i.find("@") == 0 查找包含电子邮件地址的列表元素时,它没有给我content[i]。我误解了.find() 功能吗?有没有更好的方法来做到这一点?

from os import listdir

TextFileList = []
PathInput = "C:/Users/p282705/Desktop/PythonProjects/ExtractingEmailList/text/"

# Count the number of different files you have!
for filename in listdir(PathInput):
    if filename.endswith(".txt"):  # In case you accidentally put other files in directory
        TextFileList.append(filename)

for i in TextFileList:
    file = open(PathInput + i, 'r')
    content = file.readlines()
    file.close()

for i in content:
    if i.find("@") == 0:
        print(i)

【问题讨论】:

  • find 函数返回找到的字符串的索引。如果您只是想查看字符串中是否包含“@”,那么 i.find("@") != -1,因为 -1 表示字符串中没有“@”

标签: python string python-3.x parsing


【解决方案1】:

如果找到要搜索的子字符串,Find 会返回索引。这不适合您尝试做的事情。

您最好使用正则表达式或 RE 来搜索出现的 @。在您的情况下,您可能会遇到每行有多个电子邮件地址的情况(同样我不知道您的输入数据,所以我无法猜测)

这些方面的东西会让你受益:

import re
for i in content:
    findEmail = re.search(r'[\w\.-]+@[\w\.-]+', i)
    if findEmail:
     print(findEmail.group(0))

您需要针对有效的电子邮件地址进行调整...我不完全确定您是否可以使用 + 之类的符号...

【讨论】:

  • 谢谢,问题解决!你知道如何检查它是否是无效的电子邮件吗?
  • 请注意,此解决方案仅适用于每个字符串 1 封电子邮件,因此如果您有多封电子邮件,它只会返回第一个。检查无效电子邮件是一个问题,因为您永远无法确定它是否是用户的拼写错误、电子邮件被退回或其他原因。确实没有必要进行检查,因为有很多因素超出了您的控制范围。除非您有一组特定的规则要遵循,否则我不会费心检查...最好确保有一个“@”后跟至少一个“。”
  • 这可能会帮助您更新正则表达式:stackoverflow.com/questions/2049502/…
【解决方案2】:

在 Python 中检查字符串是否包含字符的标准方法是使用in operator。在你的情况下,那将是:

for i in content:
    if "@" in i:
        print(i)

find 方法在您使用时返回 @ 字符所在的位置,从 0 开始,如 Python official documentation 中所述。

例如,在字符串abc@google.com中,它会返回3。如果没有找到该字符,它会返回-1。等效代码是:

for i in content:
    if i.find("@") != -1:
        print(i)

但是,这被认为是 unpythonic,并且首选使用 in 运算符。

【讨论】:

    【解决方案3】:

    python 中的“查找”函数返回字符串中该字符的索引号。也许你可以试试这个?

    list = i.split(' ') # To split the string in words
    for x in list:    # search each word in list for @ character
        if x.find("@") != -1:
            print(x)
    

    【讨论】:

      猜你喜欢
      • 2016-04-12
      • 2015-12-28
      • 2014-03-23
      • 2011-12-17
      • 1970-01-01
      • 1970-01-01
      • 2011-08-24
      • 1970-01-01
      相关资源
      最近更新 更多