2010-01-12 49 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))