2010-01-12 48 views
1

我有一個正則表達式,其中有兩個OR'd組,我想知道是否有可能讓一個組成爲反向引用而只有如果匹配?在任何情況下,我想匹配spam.eggs.com正則表達式中的「可選」反向引用

例子:

import re 

monitorName = re.compile(r"HQ01 : HTTP Service - [Ss][Rr][Vv]\d+\.\w+\.com:(\w+\.\w+\.(?:net|com|org))|(\w+\.\w+\.(?:net|com|org))") 

test = ["HQ01 : HTTP Service - spam.eggs.com", 
    "HQ01 : HTTP Service - spam.eggs.com - DISABLED", 
    "HQ01 : HTTP Service - srv04.example.com:spam.eggs.com", 
    "HQ01 : HTTP Service - srv04.example.com:spam.eggs.com - DISABLED"] 


for t in test: 
    m = monitorName.search(t) 
    print m.groups() 

產地:

(None, 'spam.eggs.com') 
(None, 'spam.eggs.com') 
('spam.eggs.com', None) 
('spam.eggs.com', None) 

這會是很好,如果我的團體只會回報我的一個匹配組,而不是兩個。

回答

2

|經營者有早期優先,因此它適用於(在這種情況下從正則表達式的開始)一切之前或之後的所有內容。在您正則表達式,如果沒有「srv04.example.com」,它不檢查,如果字符串中包含「HTTP服務」!

您的兩個捕獲組是相同的,所以沒有點兼具。所有你想要的是讓srv*:部分可選的,對不對?

試試這個:

r"HQ01 : HTTP Service - (?:[Ss][Rr][Vv]\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))" 
+0

咄!非常有意義。謝謝! – TheDude 2010-01-12 19:18:20

1
m = monitorName.search(t) 
g = m.groups() 
print g[0] or g[1] 
1

使用m.group(1) or m.group(2)

0

我將改寫正則表達式是

monitorName = re.compile(r"HQ01 : HTTP Service - (?:(?i)SRV\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))") 

主要生產

('spam.eggs.com',) 
('spam.eggs.com',) 
('spam.eggs.com',) 
('spam.eggs.com',) 

可以使組選與?拖尾。

0

你有沒有考慮呢?

HQ01 : HTTP Service - (?:[Ss][Rr][Vv]\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))