2016-03-07 70 views
3

我正在使用python来解析Postfix日志文件。我需要匹配包含任意多种模式的行,并在行匹配时提取IP地址Python:匹配多个正则表达式模式之一,并提取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地址,所以我不知道该怎么做那。

我会有相当多的模式匹配。什么是最干净/优雅的方式来做到这一点?

+0

请附上您的输入,电流输出和预期输出。 – Forge

回答

3

您可以使用非捕获组

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) 
+0

''^(':'''''re.compile'表达式中的':'是什么意思? –

+0

@MartinVegter'^'是字符串的开头,'(?:)'是一个非捕获组本身。 – alecxe

+0

它几乎可以工作,但是当我做'if ip:print ip.group(1)'时,它会打印'None'。显然,它与我的模式相匹配(因为'if ip'评估为true),但它不打印匹配的IP –