从大型文档中提取电子邮件子字符串

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从大型文档中提取电子邮件子字符串相关的知识,希望对你有一定的参考价值。

我有一个非常大的.txt文件,其中包含数十万个电子邮件地址。他们都采用以下格式:

...<name@domain.com>...

让Python在整个.txt文件中循环查找某个@domain字符串的所有实例,然后在<...>中获取整个地址,并将其添加到的最佳方法是什么?一个列表?我遇到的麻烦是不同地址的可变长度。

答案

code以字符串形式提取电子邮件地址。逐行阅读时使用它

>>> import re
>>> line = "should we use regex more often? let me know at  321dsasdsa@dasdsa.com.lol"
>>> match = re.search(r'[\w\.-]+@[\w\.-]+', line)
>>> match.group(0)
'321dsasdsa@dasdsa.com.lol'

如果您有多个电子邮件地址,请使用findall

>>> line = "should we use regex more often? let me know at  321dsasdsa@dasdsa.com.lol"
>>> match = re.findall(r'[\w\.-]+@[\w\.-]+', line)
>>> match
['321dsasdsa@dasdsa.com.lol', 'dadaads@dsdds.com']

上面的正则表达式可能找到最常见的非假电子邮件地址。如果您想与RFC 5322完全一致,您应该检查哪些电子邮件地址符合规范。检查this以避免在正确查找电子邮件地址时出现任何错误。


编辑:正如@kostek的评论中所建议的:在字符串Contact us at support@example.com.中,我的正则表达式返回support@example.com。 (最后带点)。为避免这种情况,请使用[\w\.,]+@[\w\.,]+\.\w+)

编辑II:评论中提到了另一个奇妙的改进:[\w\.-]+@[\w\.-]+\.\w+,它也将捕获example@do-main.com。

另一答案

您还可以使用以下内容查找文本中的所有电子邮件地址,并将它们以阵列形式打印,或者将每封电子邮件打印在单独的行中。

import re
line = "why people don't know what regex are? let me know asdfal2@als.com, Users1@gmail.de " \
       "Dariush@dasd-asasdsa.com.lo,Dariush.lastName@someDomain.com"
match = re.findall(r'[\w\.-]+@[\w\.-]+', line)
for i in match:
    print(i)

如果要将其添加到列表中,只需打印“匹配”

this will print the list

print(match)

希望这可以帮助。

另一答案

如果您正在寻找特定域名:

>>> import re
>>> text = "this is an email la@test.com, it will be matched, x@y.com will not, and test@test.com will"
>>> match = re.findall(r'[\w-\._\+%]+@test\.com',text) # replace test\.com with the domain you're looking for, adding a backslash before periods
>>> match
['la@test.com', 'test@test.com']
另一答案
import re
rgx = r'(?:\.?)([\w\-_+#~!$&\'\.]+(?<!\.)(@|[ ]?\(?[ ]?(at|AT)[ ]?\)?[ ]?)(?<!\.)[\w]+[\w\-\.]*\.[a-zA-Z-]2,3)(?:[^\w])'
matches = re.findall(rgx, text)
get_first_group = lambda y: list(map(lambda x: x[0], y))
emails = get_first_group(matches)

请不要因为这个臭名昭着的正则表达式而讨厌我。正则表达式适用于下面显示的相当一部分电子邮件地址。我主要使用this as my basis作为电子邮件地址中的有效字符。

enter image description here

随意到play around with it here

I also made a variation正则表达式捕获像name at example.com这样的电子邮件

(?:\.?)([\w\-_+#~!$&\'\.]+(?<!\.)(@|[ ]\(?[ ]?(at|AT)[ ]?\)?[ ])(?<!\.)[\w]+[\w\-\.]*\.[a-zA-Z-]2,3)(?:[^\w])
另一答案
import re
with open("file_name",'r') as f:
    s = f.read()
    result = re.findall(r'\S+@\S+',s)
    for r in result:
        print(r)
另一答案

这是针对这个特定问题的另一种方法,来自emailregex.com的正则表达式:

text = "blabla <hello@world.com>><123@123.at> <huhu@fake> bla bla <myname@some-domain.pt>"

# 1. find all potential email addresses (note: < inside <> is a problem)
matches = re.findall('<\S+?>', text)  # ['<hello@world.com>', '<123@123.at>', '<huhu@fake>', '<myname@somedomain.edu>']

# 2. apply email regex pattern to string inside <>
emails = [ x[1:-1] for x in matches if re.match(r"(^[a-zA-Z0-9_.+-]+@[a-zA-Z0-9-]+\.[a-zA-Z0-9-.]+$)", x[1:-1]) ]
print emails   # ['hello@world.com', '123@123.at', 'myname@some-domain.pt']
另一答案
import re 
txt = 'hello from absc@gmail.com to par1@yahoo.com about the meeting @2PM'
email  =re.findall('\S+@\S+',s)
print(email)

印刷输出:

['absc@gmail.com', 'par1@yahoo.com']

以上是关于从大型文档中提取电子邮件子字符串的主要内容,如果未能解决你的问题,请参考以下文章

PB中取字符串子串的函数是啥

使用 Python 的字符串子序列内核和 SVM

如何更改python字符串子字符串信息

[在python中使用正则表达式搜索字符串子字符串

如何有效地从大型 Excel 文档中检索所有字符串

数组篇在python中如何查找最长字符串子串