2010-01-12 3 views
1

J'ai une expression régulière avec deux groupes qui sont OR'd et je me demande s'il est possible d'avoir un groupe comme référence seulement s'il correspond? Dans tous les cas, je suis désireux de faire correspondre spam.eggs.comRéférences «facultatives» dans l'expression régulière

Exemple:

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() 

Produit:

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

Ce serait bien si mes groupes ne reviendrait mon groupe apparié et pas les deux.

Répondre

2

L'opérateur | a priorité début il applique à tout avant qu'il (depuis le début de votre regex dans ce cas) OU tout ce qui suit. Dans votre regex, s'il n'y a pas de "srv04.example.com", il ne vérifie pas si la chaîne contient "HTTP Service"!

Vos deux groupes de capture sont identiques, donc il ne sert à rien d'avoir les deux. Tout ce que vous voulez, c'est d'avoir la pièce srv*: en option, non?

Essayez celui-ci:

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

Duh! Cela a un sens parfait. Je vous remercie! – TheDude

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

Utilisez m.group(1) or m.group(2).

0

Je réécrira l'expression régulière à

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

Produit

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

Vous pouvez faire un groupe en option par tailing avec ?.

0

Avez-vous considéré cela?

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