Python:如何最好地将两个正则表达式组合成一个模式匹配?
Python: how best to combine two regex's into one pattern match?
给定 header 类型 接收 字段的电子邮件列表,例如:
Received: by 10.194.174.73 with SMTP id bq9csp183244wjc;
Mon, 5 May 2014 17:49:10 -0700 (PDT)
X-Received: by 10.180.14.233 with SMTP id s9mr18354760wic.53.1399337350112;
Mon, 05 May 2014 17:49:10 -0700 (PDT)
Received: from mail-wg0-f52.google.com
Received: by mail-ie0-x247.google.com with SMTP id gx4so163592215ieb.1
for <myemailaddress@gmail.com>; Mon, 01 Jun 2015 18:34:50 -0700 (PDT)
每个字段按 IP 地址或域名报告 "hop"。我正在寻找一个可以兼顾两者的正则表达式。
以下正则表达式将分别提取 IP 地址和 (gmail) 域名:
\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b
mail.*com
在 Python 中组合两个或多个模式的最优雅方法是什么?我将遍历 Receive 字段列表和 运行 每个字段的正则表达式。
为什么不使用交替?
patterns = [r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", r"mail.*com"]
pattern = "|".join(patterns) # pattern1|pattern2|pattern3|...
re.findall(pattern, text)
产量
['10.194.174.73',
'10.180.14.233',
'mail-wg0-f52.google.com',
'mail-ie0-x247.google.com',
'mailaddress@gmail.com']
如果您只想捕获跃点的所有域和 IP,您可以像这样使用正则表达式。
在python中:
import re
pat = r'(?:by|for|from) <?([^\s;>]+)'
print(re.findall(pat, text))
->
['10.194.174.73', '10.180.14.233', 'mail-wg0-f52.google.com', 'mail-ie0-x247.google.com', 'myemailaddress@gmail.com>']
(编辑以同时捕获电子邮件)
给定 header 类型 接收 字段的电子邮件列表,例如:
Received: by 10.194.174.73 with SMTP id bq9csp183244wjc;
Mon, 5 May 2014 17:49:10 -0700 (PDT)
X-Received: by 10.180.14.233 with SMTP id s9mr18354760wic.53.1399337350112;
Mon, 05 May 2014 17:49:10 -0700 (PDT)
Received: from mail-wg0-f52.google.com
Received: by mail-ie0-x247.google.com with SMTP id gx4so163592215ieb.1
for <myemailaddress@gmail.com>; Mon, 01 Jun 2015 18:34:50 -0700 (PDT)
每个字段按 IP 地址或域名报告 "hop"。我正在寻找一个可以兼顾两者的正则表达式。
以下正则表达式将分别提取 IP 地址和 (gmail) 域名:
\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b
mail.*com
在 Python 中组合两个或多个模式的最优雅方法是什么?我将遍历 Receive 字段列表和 运行 每个字段的正则表达式。
为什么不使用交替?
patterns = [r"\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b", r"mail.*com"]
pattern = "|".join(patterns) # pattern1|pattern2|pattern3|...
re.findall(pattern, text)
产量
['10.194.174.73',
'10.180.14.233',
'mail-wg0-f52.google.com',
'mail-ie0-x247.google.com',
'mailaddress@gmail.com']
如果您只想捕获跃点的所有域和 IP,您可以像这样使用正则表达式。
在python中:
import re
pat = r'(?:by|for|from) <?([^\s;>]+)'
print(re.findall(pat, text))
->
['10.194.174.73', '10.180.14.233', 'mail-wg0-f52.google.com', 'mail-ie0-x247.google.com', 'myemailaddress@gmail.com>']
(编辑以同时捕获电子邮件)