正则表达式中的“可选”反向引用

时间:2010-01-12 18:59:53

标签: python regex

我有一个正则表达式,其中有两个组是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 个答案:

答案 0 :(得分:2)

|运算符具有早期优先级,因此它适用于之前的所有(在此情况下从正则表达式的开头)或其后的所有内容。在正则表达式中,如果没有“srv04.example.com”,则不检查字符串是否包含“HTTP服务”!

你的两个捕获组是相同的,所以两者都没有意义。你想要的只是让srv*:部分可选,对吗?

试试这个:

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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

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

答案 3 :(得分: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',)

您可以通过使用?进行跟踪来使组成为可选项。

答案 4 :(得分:0)

你有没有考虑过这个?

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