我有一个包含大量电子邮件地址的大型 .txt 文件,但它也包含许多不必要的“ " 字符。我只想提取电子邮件地址并删除任何其他字符。
为此,我用 Python 编写了一个小脚本。
import re
filename = "input.txt"
output_filename = "output.txt"
email_regex = r'\s*([A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,})\s*'
with open(filename, "r") as f, open(output_filename, "w") as out:
for line in f:
emails = re.findall(email_regex, line)
for email in emails:
out.write(email + "\n")
虽然脚本成功提取了常规电子邮件地址,但在处理某些格式时遇到了一些困难。
举个例子,假设我有一行数据是“CC [email protected] ”。当我运行我的代码时,生成的输出是“[email protected]”,这不是我想要的。相反,我希望输出是“[email protected]”而没有前导“n”字符”
接下来,我测试了另一个用于单个电子邮件地址的小 Python 脚本,结果成功了。
import re
string = "CC\[email protected]\n"
email_regex = r'[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Z|a-z]{2,}'
email = re.search(email_regex, string).group()
print(email)
所以我想从一个大文件中得到相同的结果。如果您对此有解决方案,那对我有好处。
暗中拍摄:因为您说匹配
CC\[email protected]\n
会导致[email protected]
,我猜您的“\n
字符”不是换行符,而是实际的\
s后跟n
s .如果管道中的某处内容被错误地转义,或者文本来自源代码,就会发生这种情况。
这可以解释为什么您的小示例使用硬编码字符串而不是文本文件:当您编写
string = "CC\[email protected]\n"
时,Python 本身正在用换行符替换\n
字符。要模拟文本文件的内容,您应该使用 string = "CC\\[email protected]\\n"
.
如果是这种情况,您可以在正则表达式中添加 negative lookbehind,例如
(?<\\n)rest_of_email_regex_here
.
或者更简单地说,做一个预处理步骤,用实际的换行符替换所有这些字符:
...
for line in f:
line = line.replace('\\n', '\n')
emails = re.findall(email_regex, line)
...
如果您的文本文件真的只包含
\n
和电子邮件地址,替换 \n
后,您可以跳过正则表达式并使用 line.split()
提取所有地址。这将返回所有非空格字符序列。