如何在正则表达式中对文本进行分组,但不将其显示在群组的搜索结果中?

时间:2017-09-19 18:53:53

标签: python regex

举个例子,假设我有这些测试字符串和正则表达式:

git_describes = ['v1.0.0-beta-1-g5d1a5a2', 'v1.0.0-g5d1a5a2', 'v1.0.0-alpha-1-g5d1a5a2', 'v1.0.0-1-g5d1a5a2']
git_regex = r'v([0-9]+.[0-9]+.[0-9]+)(-(beta|alpha))?(-([0-9]+))?-g([a-f0-9]+)'
for g in git_describes:
    print re.search(git_regex, g).groups()

谁的输出是:

('1.0.0', '-beta', 'beta', '-1', '1', '5d1a5a2')
('1.0.0', None, None, None, None, '5d1a5a2')
('1.0.0', '-alpha', 'alpha', '-1', '1', '5d1a5a2')
('1.0.0', None, None, '-1', '1', '5d1a5a2')

我使用条件(-(beta|alpha))?对短划线进行分组,但我对在最终分组结果中看到它们不感兴趣。

删除tupled结果的第2和第4个条目是一件简单的事情,但是如何编写正则表达式以使它们不包含在第一位?即。

('1.0.0', 'beta', '1', '5d1a5a2')
('1.0.0', None, None, '5d1a5a2')
('1.0.0', 'alpha', '1', '5d1a5a2')
('1.0.0', None, '1', '5d1a5a2')

1 个答案:

答案 0 :(得分:2)

您要求的是非捕获组。您写(...)而不是(?:...),因此该组仍将用于匹配,但不会被添加到结果中。

有关详细信息,请参阅python's official regex documentation