从电子邮件文本中解析"发件人"地址

14 python string email parsing text

我正在尝试从电子邮件的纯文本脚本中提取电子邮件地址.我拼凑了一些代码来查找地址本身,但我不知道如何区分它们; 现在它只是吐出文件中的所有电子邮件地址.我想这样做它只会吐出前面有"From:"和一些通配符的地址,并以">"结尾(因为电子邮件设置为From [name] <[email]> ).

这是现在的代码:

import re #allows program to use regular expressions
foundemail = []
#this is an empty list

mailsrch = re.compile(r'[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}')
 #do not currently know exact meaning of this expression but assuming
 #it means something like "[stuff]@[stuff][stuff1-4 letters]"

        # "line" is a variable is set to a single line read from the file
# ("text.txt"):
for line in open("text.txt"):

    foundemail.extend(mailsrch.findall(line))

    # this extends the previously named list via the "mailsrch" variable
      #which was named before

print foundemail
Run Code Online (Sandbox Code Playgroud)

Van*_*ale 36

试试这个:

>>> from email.utils import parseaddr

>>> parseaddr('From: vg@m.com')
('', 'vg@m.com')

>>> parseaddr('From: Van Gale <vg@m.com>')
('Van Gale', 'vg@m.com')

>>> parseaddr('    From: Van Gale <vg@m.com>   ')
('Van Gale', 'vg@m.com')

>>> parseaddr('blah abdf    From: Van Gale <vg@m.com>   and this')
('Van Gale', 'vg@m.com')
Run Code Online (Sandbox Code Playgroud)

不幸的是,它只找到每行中的第一封电子邮件,因为它期待标题行,但也许这没关系?

  • parseaddr 实际上只是 AddressList(addr).addresslist[0] 所以你可以做 AddressList(addr).addresslist 来获取它们 (2认同)

Can*_*der 9

import email
msg = email.message_from_string(str)

# or
# f = open(file)
# msg = email.message_from_file(f)

msg['from']

# and optionally
from email.utils import parseaddr
addr = parseaddr(msg['from'])
Run Code Online (Sandbox Code Playgroud)


Dav*_*d Z 3

如果您的目标实际上是从文本中提取电子邮件地址,您应该使用为此目的构建的库。正则表达式不太适合匹配任意电子邮件地址。

但是,如果您这样做是为了更好地理解正则表达式,我会采取扩展您正在使用的表达式以包含您想要匹配的额外文本的方法。首先,让我解释一下该正则表达式的作用:

[\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4}
Run Code Online (Sandbox Code Playgroud)
  • [\w\-]匹配任何“单词”字符(字母、数字或下划线)连字符
  • [\w\-\.]+匹配(任何单词字符连字符句点)一次或多次
  • @匹配文字“@”
  • [\w\-]匹配任何单词字符连字符
  • [\w\-\.]+匹配(任何单词字符连字符句点)一次或多次
  • [a-zA-Z]{1,4}匹配 1、2、3 或 4 个小写或大写字母

因此,这匹配可能包含连字符或句点但不以句点开头的“单词”序列,后跟一个符号@,后跟另一个以字母结尾的“单词”(与之前的含义相同)。

现在,要根据您的目的修改此内容,让我们添加正则表达式部分以匹配“From”、名称和尖括号:

From: [\w\s]+?<([\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>
Run Code Online (Sandbox Code Playgroud)
  • From:匹配文字文本“From:”
  • [\w\s]+?匹配一个或多个连续的单词字符空格字符。问号使匹配变得非贪婪,因此它将匹配尽可能少的字符,同时仍然允许整个正则表达式匹配(在这种情况下,可能没有必要,但它确实使匹配更有效,因为紧随其后的不是单词字符或空格字符)。
  • <匹配字面小于号(左尖括号)
  • 之前使用的相同正则表达式现在被括号括起来。这使其成为一个捕获组,因此您可以调用m.group(1)以获取与正则表达式的该部分匹配的文本。
  • >匹配文字大于号

由于正则表达式现在使用捕获组,因此您的代码也需要进行一些更改:

import re
foundemail = []

mailsrch = re.compile(r'From: [\w\s]+?<([\w\-][\w\-\.]+@[\w\-][\w\-\.]+[a-zA-Z]{1,4})>')

for line in open("text.txt"):
    foundemail.extend([m.group(1) for m in mailsrch.finditer(line)])

print foundemail
Run Code Online (Sandbox Code Playgroud)

该代码[m.group(1) for m in mailsrch.finditer(line)]从正则表达式找到的每个匹配项的第一个捕获组(请记住,这是括号中的部分)中生成一个列表。