2016-03-07 44 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 –