53

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

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

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

4

13 回答 13

127

代码提取字符串中的电子邮件地址。逐行阅读时使用它

>>> 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 :)。最后,您实际上不需要在字符类中转义句点,因此它不会那样做。”

于 2013-07-16T16:20:33.943 回答
11

您还可以使用以下命令查找文本中的所有电子邮件地址,并将它们打印在数组中或将每封电子邮件打印在单独的行中。

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)
于 2015-10-26T18:22:09.300 回答
8
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])
于 2018-10-02T12:02:03.510 回答
4

如果您正在寻找特定域:

>>> 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']
于 2013-07-16T16:36:26.667 回答
1
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']
于 2020-01-17T10:53:44.990 回答
0

您可以在末尾使用 \b 来获取正确的电子邮件来定义电子邮件的结尾。

正则表达式

[\w\.\-]+@[\w\-\.]+\b
于 2020-01-29T06:59:17.823 回答
0
#    \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))
于 2021-07-02T12:35:01.217 回答
0

示例:如果邮件 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'
于 2020-11-18T13:59:32.213 回答
0
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)
于 2021-01-30T09:33:50.100 回答
0
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,电子邮件。

于 2019-07-26T07:15:25.537 回答
-1
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']
于 2018-11-10T10:05:29.613 回答
-1

这是解决此特定问题的另一种方法,使用来自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']
于 2017-01-12T15:00:59.447 回答
-1
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)
于 2019-04-17T12:00:15.433 回答