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)

如果我的小组只返回我的一个匹配组而不是两者都返回,那就太好了。

4

5 回答 5

2

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

您的两个捕获组是相同的,因此两者都没有意义。你想要的只是让这个srv*:部分是可选的,对吧?

试试这个:

r"HQ01 : HTTP Service - (?:[Ss][Rr][Vv]\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))"
于 2010-01-12T19:03:15.357 回答
1
m = monitorName.search(t)
g = m.groups()
print g[0] or g[1]
于 2010-01-12T19:02:32.517 回答
1

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

于 2010-01-12T19:03:02.907 回答
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',)

您可以通过尾随?.

于 2010-01-12T19:16:47.407 回答
0

你考虑过这个吗?

HQ01 : HTTP Service - (?:[Ss][Rr][Vv]\d+\.\w+\.com:)?(\w+\.\w+\.(?:net|com|org))
于 2010-01-12T19:17:41.253 回答