2010-01-12 6 views
1

OR이라는 두 그룹이있는 정규 표현식이 있습니다. 그룹을 역 참조로 사용할 수 있는지 궁금합니다. 일치하는 경우 모든 경우에, 나는 일치 꿔 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

Duh! 완벽하게 이해합니다. 고맙습니다! – TheDude

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)) 
관련 문제