正则表达式查找前两个字符串实例之间的电子邮件地址
Regex Find email address between First Two Instances of Strings
我有来自一系列电子邮件的原始文本。
For all inquiries please reach out
From: abc@abc.com At: 01/27/21 23:29:28To: CompanyA
Cc: 123@123.com, 345@345-YYY.com Subject: this is the subject line
From: CompanyB(company) <mmm@mmm.net>
Sent: Wednesday, January 27, 2021 12:51 PM
From: 999@999.com At: 01/27/21 23:29:28To: CompanyA
Cc: 888@888.com, 777@777.com Subject: tect
通过 Regex,我需要捕获第一个单词 From 到第一个 Subject 之间的电子邮件地址。在上面的匹配应该是:
abc@abc.com
123@123.com
345@345-YYY.com
我有 (\n){0,1}([\w.]@[\w+-.]) 获取电子邮件地址。我将通过 Python 正则表达式库进行匹配。
一种选择是使用 2 种模式与 re.
首先找到从 From:
到第一次出现 Subject:
的所有匹配项
(?s)\bFrom:.*?\bSubject:
然后对于所有这些匹配项,在不匹配 <
和 >
的情况下获取类似模式的电子邮件地址
[^<>\s@]+@[^@\s<>]+
例子
import re
s = ("For all inquiries please reach out\n"
"From: abc@abc.com At: 01/27/21 23:29:28To: CompanyA\n"
"Cc: 123@123.com, 345@345-YYY.com Subject: this is the subject line\n"
"From: CompanyB(company) <mmm@mmm.net>\n"
"Sent: Wednesday, January 27, 2021 12:51 PM\n"
"From: 999@999.com At: 01/27/21 23:29:28To: CompanyA\n"
"Cc: 888@888.com, 777@777.com Subject: tect")
for match in re.findall(r"(?s)\bFrom:.*?\bSubject:", s):
print(re.findall(r"[^<>\s@]+@[^@\s<>]+", match))
输出
['abc@abc.com', '123@123.com,', '345@345-YYY.com']
['mmm@mmm.net', '999@999.com', '888@888.com,', '777@777.com']
如果您不想再出现 From:
或 Subject
,您可以使用否定先行检查该行是否不包含任何字符串。
^From:.*(?:\r?\n(?!From|.*\bSubject:).*)*\r?\n.*\bSubject:
例子
for match in re.findall(r"(?m)^From:.*(?:\r?\n(?!From|.*\bSubject:).*)*\r?\n.*\bSubject:", s):
print(re.findall(r"[^<>\s@]+@[^@\s<>]+", match))
输出
['abc@abc.com', '123@123.com,', '345@345-YYY.com']
['999@999.com', '888@888.com,', '777@777.com']
我有来自一系列电子邮件的原始文本。
For all inquiries please reach out
From: abc@abc.com At: 01/27/21 23:29:28To: CompanyA
Cc: 123@123.com, 345@345-YYY.com Subject: this is the subject line
From: CompanyB(company) <mmm@mmm.net>
Sent: Wednesday, January 27, 2021 12:51 PM
From: 999@999.com At: 01/27/21 23:29:28To: CompanyA
Cc: 888@888.com, 777@777.com Subject: tect
通过 Regex,我需要捕获第一个单词 From 到第一个 Subject 之间的电子邮件地址。在上面的匹配应该是:
abc@abc.com
123@123.com
345@345-YYY.com
我有 (\n){0,1}([\w.]@[\w+-.]) 获取电子邮件地址。我将通过 Python 正则表达式库进行匹配。
一种选择是使用 2 种模式与 re.
首先找到从 From:
到第一次出现 Subject:
(?s)\bFrom:.*?\bSubject:
然后对于所有这些匹配项,在不匹配 <
和 >
[^<>\s@]+@[^@\s<>]+
例子
import re
s = ("For all inquiries please reach out\n"
"From: abc@abc.com At: 01/27/21 23:29:28To: CompanyA\n"
"Cc: 123@123.com, 345@345-YYY.com Subject: this is the subject line\n"
"From: CompanyB(company) <mmm@mmm.net>\n"
"Sent: Wednesday, January 27, 2021 12:51 PM\n"
"From: 999@999.com At: 01/27/21 23:29:28To: CompanyA\n"
"Cc: 888@888.com, 777@777.com Subject: tect")
for match in re.findall(r"(?s)\bFrom:.*?\bSubject:", s):
print(re.findall(r"[^<>\s@]+@[^@\s<>]+", match))
输出
['abc@abc.com', '123@123.com,', '345@345-YYY.com']
['mmm@mmm.net', '999@999.com', '888@888.com,', '777@777.com']
如果您不想再出现 From:
或 Subject
,您可以使用否定先行检查该行是否不包含任何字符串。
^From:.*(?:\r?\n(?!From|.*\bSubject:).*)*\r?\n.*\bSubject:
例子
for match in re.findall(r"(?m)^From:.*(?:\r?\n(?!From|.*\bSubject:).*)*\r?\n.*\bSubject:", s):
print(re.findall(r"[^<>\s@]+@[^@\s<>]+", match))
输出
['abc@abc.com', '123@123.com,', '345@345-YYY.com']
['999@999.com', '888@888.com,', '777@777.com']