我有一个非常大的 .txt 文件,其中散布着数十万个电子邮件地址。它们都采用以下格式:
...<name@domain.com>...
让 Python 在整个 .txt 文件中循环查找某个 @domain 字符串的所有实例,然后在 <...> 中获取整个地址并将其添加到的最佳方法是什么?一个列表?我遇到的麻烦是不同地址的可变长度。
此代码提取字符串中的电子邮件地址。逐行阅读时使用它
>>> import re
>>> line = "should we use regex more often? let me know at 321dsasdsa@dasdsa.com.lol"
>>> match = re.search(r'[\w.+-]+@[\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 or dadaads@dsdds.com"
>>> match = re.findall(r'[\w.+-]+@[\w-]+\.[\w.-]+', line)
>>> match
['321dsasdsa@dasdsa.com.lol', 'dadaads@dsdds.com']
上面的正则表达式可能会找到最常见的非虚假电子邮件地址。如果您想完全符合RFC 5322,您应该检查哪些电子邮件地址符合规范。检查这一点以避免在正确查找电子邮件地址时出现任何错误。
编辑:正如@kostek评论中所建议的那样:在字符串中,Contact us at support@example.com.
我的正则表达式返回 support@example.com。(最后有点)。为避免这种情况,请使用[\w\.,]+@[\w\.,]+\.\w+)
编辑二:评论中提到了另一个很棒的改进:[\w\.-]+@[\w\.-]+\.\w+
它也将捕获 example@do-main.com。
编辑 III:添加了评论中讨论的进一步改进:“除了在地址的开头允许 + 之外,这还确保域中至少有一个句点。它允许域的多个段,如 abc.co。 uk 也是如此,并且不匹配 bad@ss :)。最后,您实际上不需要在字符类中转义句点,因此它不会那样做。”
您还可以使用以下命令查找文本中的所有电子邮件地址,并将它们打印在数组中或将每封电子邮件打印在单独的行中。
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
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)
请不要因为我尝试了这个臭名昭著的正则表达式而讨厌我。正则表达式适用于如下所示的相当一部分电子邮件地址。我主要将此用作电子邮件地址中有效字符的基础。
随意在这里玩
我还做了一个变体,正则表达式捕获电子邮件,例如name at example.com
(?:\.?)([\w\-_+#~!$&\'\.]+(?<!\.)(@|[ ]\(?[ ]?(at|AT)[ ]?\)?[ ])(?<!\.)[\w]+[\w\-\.]*\.[a-zA-Z-]{2,3})(?:[^\w])
如果您正在寻找特定域:
>>> 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
reg_pat = r'\S+@\S+\.\S+'
test_text = 'xyz.byc@cfg-jj.com ir_er@cu.co.kl uiufubvcbuw bvkw ko@com m@urice'
emails = re.findall(reg_pat ,test_text,re.IGNORECASE)
print(emails)
输出:
['xyz.byc@cfg-jj.com', 'ir_er@cu.co.kl']
您可以在末尾使用 \b 来获取正确的电子邮件来定义电子邮件的结尾。
正则表达式
[\w\.\-]+@[\w\-\.]+\b
# \b[\w|\.]+ ---> means begins with any english and number character or dot.
import re
marks = '''
!()[]{};?#$%:'"\,/^&é*
'''
text = 'Hello from priyankv@gmail.com to python@gmail.com, datascience@@gmail.com and machinelearning@@yahoo..com wrong email address: farzad@google.commmm'
# list of sequences of characters:
text_pieces = text.split()
pattern = r'\b[a-zA-Z]{1}[\w|\.]*@[\w|\.]+\.[a-zA-Z]{2,3}$'
for p in text_pieces:
for x in marks:
p = p.replace(x, "")
if len(re.findall(pattern, p)) > 0:
print(re.findall(pattern, p))
示例:如果邮件 id 具有字符串(az 全部较低且 _ 或任何编号 0-9),则以下将是正则表达式:
>>> str1 = "abcdef_12345@gmail.com"
>>> regex1 = "^[a-z0-9]+[\._]?[a-z0-9]+[@]\w+[.]\w{2,3}$"
>>> re_com = re.compile(regex1)
>>> re_match = re_com.search(str1)
>>> re_match
<_sre.SRE_Match object at 0x1063c9ac0>
>>> re_match.group(0)
'abcdef_12345@gmail.com'
content = ' abcdabcd jcopelan@nyx.cs.du.edu afgh 65882@mimsy.umd.edu qwertyuiop mangoe@cs.umd'
match_objects = re.findall(r'\w+@\w+[\.\w+]+', content)
import re
mess = '''Jawadahmed@gmail.com Ahmed@gmail.com
abc@gmail'''
email = re.compile(r'([\w\.-]+@gmail.com)')
result= email.findall(mess)
if(result != None):
print(result)
上面的代码将对您有所帮助,并在调用后才带上Gmail,电子邮件。
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']
这是解决此特定问题的另一种方法,使用来自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
with open("file_name",'r') as f:
s = f.read()
result = re.findall(r'\S+@\S+',s)
for r in result:
print(r)