【问题标题】:Python: match one of multiple regex patterns and extract IP address if matchPython:匹配多个正则表达式模式之一并在匹配时提取IP地址
【发布时间】:2016-03-07 13:49:50
【问题描述】:

我正在使用 python 来解析 Postfix 日志文件。我需要匹配包含多个模式中的任何一个的行,如果行匹配,则提取 IP 地址

ip = re.search('^warning: Connection rate limit exceeded: [0-9]* from .*\[([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\] for service smtp', message)
if not ip:
    ip = re.search('^NOQUEUE: reject: RCPT from .*\[([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\]: .*: Relay access denied; .*', message)
    if not ip:
        ip = re.search('^NOQUEUE: reject: RCPT from .*\[([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\]: .*:  Recipient address rejected: .*', message)
...
...
print ip.group(1)

任何一行都只会匹配一个模式。我知道通常我可以使用 '(pattern1|pattern2|pattern3)' 来匹配多个模式中的任何一个,但是由于我已经使用括号 () 来对要提取的 IP 地址进行分组,所以我不知道如何这样做。

我将有很多模式要匹配。最干净/优雅的方式是什么?

【问题讨论】:

  • 请包括您的输入、当前输出和预期输出。

标签: python regex


【解决方案1】:

您可以使用非捕获组

patterns = [
    "warning: Connection rate limit exceeded: [0-9]* from .*\[([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\] for service smtp",
    "NOQUEUE: reject: RCPT from .*\[([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\]: .*: Relay access denied; .*",
    "NOQUEUE: reject: RCPT from .*\[([0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3})\]: .*:  Recipient address rejected: .*"
]
pattern = re.compile("^(?:" + "|".join(patterns) + ")")
ip = pattern.search(message)

【讨论】:

  • "^(?:"re.compile 表达式中是什么意思?
  • @MartinVegter ^ 是字符串的开头,(?:) 本身是一个非捕获组。
  • 它几乎可以工作,但是当我执行if ip: print ip.group(1) 时,它会打印None。显然,它与我的模式匹配(因为 if ip 评估为真),但它不打印匹配的 ip。
  • 我知道发生了什么:当第二个模式匹配时,ip.group(1)None。在这种情况下,IP 位于ip.group(2)。但我不知道我的哪些模式匹配。如何打印ip.group(n),其中n 是唯一非None 值?
  • @MartinVegter 知道了,您是否尝试过查看groups()?谢谢。
猜你喜欢
  • 2012-05-17
  • 1970-01-01
  • 2012-04-27
  • 1970-01-01
  • 2011-05-12
  • 2011-08-17
  • 2011-08-27
  • 2011-03-01
  • 2016-12-15
相关资源
最近更新 更多