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

1 投票
5 回答
722 浏览
提问于 2025-04-15 17:56

我有一个正则表达式,里面有两个组是用“或”连接的。我在想,如果其中一个组匹配了,能否让它成为一个回溯引用仅在匹配时?我想要匹配的内容是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 个回答

1

在编程中,有时候我们会遇到一些问题,特别是在使用某些工具或库的时候。这些问题可能会让我们感到困惑,不知道该如何解决。比如,有人可能在使用某个特定的功能时,发现它并没有按照预期的方式工作。这种情况下,通常我们会去查找相关的资料,看看有没有人遇到过类似的问题,或者有没有解决方案。

在StackOverflow上,很多人会分享他们的经验和解决办法。你可以看到各种各样的问题和答案,这些内容可以帮助你更好地理解你所遇到的困难。通过阅读这些讨论,你可能会找到解决你问题的方法,或者至少能让你明白为什么会出现这个问题。

总之,遇到问题时,不要着急,先去查找资料,看看有没有人已经解决了类似的问题。这样可以节省很多时间,让你更快地找到答案。

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

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

2

|这个符号的优先级很高,所以它会作用于它前面的所有内容(在这个例子中,就是从你的正则表达式的开头开始)或者它后面的所有内容。在你的正则表达式中,如果没有“srv04.example.com”,那么它就不会检查字符串是否包含“HTTP Service”!

你有两个捕获组是一样的,所以保留两个没有意义。你只想让srv*:这一部分是可选的,对吧?

试试这个:

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

撰写回答