我有一个正则表达式,其中有两个组是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)
如果我的小组只返回我的一个匹配组,而不是两者,那就太好了。
答案 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))