«Необязательные» обратные ссылки в регулярном выражении - PullRequest
1 голос
/ 12 января 2010

У меня есть регулярное выражение с двумя группами, имеющими 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)

Было бы хорошо, если бы мои группы возвращали только одну подходящую мне группу, а не обе.

Ответы [ 5 ]

2 голосов
/ 12 января 2010

Оператор | имеет ранний приоритет, поэтому он применяется к всему до него ( от начала вашего регулярного выражения в данном случае) ИЛИ ко всему после него. В вашем регулярном выражении, если нет «srv04.example.com», он не проверяет, содержит ли строка «Служба HTTP»!

Ваши две группы захвата идентичны, поэтому нет смысла иметь обе. Все, что вы хотите, это иметь необязательную деталь srv*:, верно?

Попробуйте это:

r"HQ01 : HTTP Service - (?:[Ss][Rr][Vv]\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))"
1 голос
/ 12 января 2010

Использование m.group(1) or m.group(2).

1 голос
/ 12 января 2010
m = monitorName.search(t)
g = m.groups()
print g[0] or g[1]
0 голосов
/ 12 января 2010

Вы рассматривали это?

HQ01 : HTTP Service - (?:[Ss][Rr][Vv]\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))
0 голосов
/ 12 января 2010

Я перепишу регулярное выражение, чтобы оно было

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',)

Вы можете сделать группу необязательной, задав хвост ?.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...