Python:如何最好地将两个正则表达式组合成一个模式匹配?

时间:2015-06-03 23:40:47

标签: python regex match

给出 Receive 类型的电子邮件标题字段列表,例如:

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)

每个字段报告&#34; hop&#34;通过IP地址或域名。我正在寻找一个能够处理这两者的正则表达式。

以下正则表达式将分别提取IP地址和(gmail)域名:

\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}\b
mail.*com

在Python中组合两种或更多模式的最优雅方法是什么?我将遍历接收字段列表并对每个字段运行正则表达式。

2 个答案:

答案 0 :(得分:1)

为什么不使用替换?

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']

答案 1 :(得分:1)

如果你想捕获跳跃的所有域和IP,你可以像这样使用正则表达式。

在python中:

import re
pat = r'(?:by|for|from) <?([^\s;>]+)'
print(re.findall(pat, text))

- &GT;

['10.194.174.73', '10.180.14.233', 'mail-wg0-f52.google.com', 'mail-ie0-x247.google.com', 'myemailaddress@gmail.com>']

(编辑以捕捉电子邮件)