如何删除“ " 使用 Python 处理大文件中的字符?

问题描述 投票:0回答:1

我有一个包含大量电子邮件地址的大型 .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)

所以我想从一个大文件中得到相同的结果。如果您对此有解决方案,那对我有好处。

python regex-group
1个回答
0
投票

暗中拍摄:因为您说匹配

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()
提取所有地址。这将返回所有非空格字符序列。

© www.soinside.com 2019 - 2024. All rights reserved.