举个例子,假设我有这些测试字符串和正则表达式:
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')
答案 0 :(得分:2)
您要求的是非捕获组。您写(...)
而不是(?:...)
,因此该组仍将用于匹配,但不会被添加到结果中。
有关详细信息,请参阅python's official regex documentation。