从大型文档中提取电子邮件子字符串
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作为电子邮件地址中的有效字符。
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']
以上是关于从大型文档中提取电子邮件子字符串的主要内容,如果未能解决你的问题,请参考以下文章