Python正则表达式从文本中获取特定行

2024-10-02 00:22:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要从电子邮件正文中获取解析的具体细节,在这种情况下,电子邮件是纯文本的,格式如下:

imbad@regex.com
John Doe
+16073948374
2021-04-27T15:38:11+0000
14904

上面是从电子邮件解析的print(body)输出示例,如下所示:

def parseEmail(popServer, msgNum):
    raw_message=popServer.retr(msgNum)[1]
    str_message=email.message_from_bytes(b'\n'.join(raw_message))
    body=str(str_message.get_payload())

所以,如果我需要简单地从body object中获取电子邮件地址和电话号码,我可以如何使用regex实现这一点

我知道正则表达式在这方面无疑是过火了,但是我只是重新利用一个已经编写好的内部实用程序来利用正则表达式进行更复杂的查询,所以这里最简单的解决方案似乎是修改正则表达式以获取所需的文本。尝试使用str.partition()会导致其他不相关的错误

先谢谢你


Tags: 文本com利用messageraw电子邮件格式情况
3条回答

您可以使用以下正则表达式模式:

对于电子邮件:\.+@.+\n/g

电话号码:\^[+]\d+\n/gm

如果在python re库中使用,请删除初始正斜杠

注意:在email one中,仅使用全局标志,但对于电话号码模式,也使用多行标志

只需在每个身体上循环,捕捉这些细节并按您喜欢的方式存储它们

在澄清问题的评论中,您指出电子邮件地址始终位于第一行,电话号码始终位于第三行。在这种情况下,我只需要拆分行,而不是尝试用RE匹配它们

lines = body.split("\n")
email = lines[0]
phone = lines[2]

要匹配第1行和第3行上的模式,可以使用两个捕获组,使用单个正则表达式:

^([^\s@]+@[^\s@]+)\r?\n.*\r?\n(\+\d+)$

模式匹配:

  • ^字符串的开头
  • ([^\s@]+@[^\s@]+)组1中捕获类似电子邮件的模式(第一行只有一个@)
  • \r?\n.*\r?\n匹配(不捕获)第二行
  • (\+\d+)第2组
  • $字符串的结尾

Regex demo

范例

import re

regex = r"^([^\s@]+@[^\s@]+)\r?\n.*\r?\n(\+\d+)$"

s = ("imbad@regex.com\n"
     "John Doe\n"
     "+16073948374\n"
     "2021-04-27T15:38:11+0000\n"
     "14904")

match = re.match(regex, s, re.MULTILINE)

if match:
        print(f"{match.group(1)}, {match.group(2)}")

输出

imbad@regex.com, +16073948374

相关问题 更多 >

    热门问题