Skip to main content
 首页 » 编程设计

python之匹配正则表达式而不捕获

2024年08月25日27shanyou

我想用正则表达式提取一些模式。作为简化示例,我在下面有一些文本,我想为第二个字段提取不带下划线的文本:

  1. main_opt.otherstuff 应返回三个字段:"main"、"opt"、"otherstuff"
  2. main.otherstuff 应返回三个字段:"main"、""、"otherstuff"

如果我将正则表达式指定为 ^([^_]+)_?([^.]+)?\\.(.+)$,我就能得到这个。但是,我想知道我是否可以更改此模式 _?([^.]+)? 其中只指定一个 ? 因为它们是同一子模式的一部分。

我试过 ([^_]+)((?=_)[^.]+)?\\.(.+)$ 和 ([^_ ]+)((?:_)[^.]+)?\\.(.+)$ 但他们为第二个字段返回“_opt”而不是“opt”。 (如果重要的话,我正在使用 python 的 re 包。)

请您参考如下方法:

您可以将它们分组到非捕获组 (?: ... ) 中,但它不会比您的原始解决方案更漂亮:

^([^_]+)(?:_([^.]+))?\\.(.+)$ 

参见 Demo

在 Python 控制台上测试:

>>> re.findall(r'^([^_]+)(?:_([^.]+))?\.(.+)$', "main_opt.otherstuff") 
[('main', 'opt', 'otherstuff')] 
>>> re.findall(r'^([^_]+)(?:_([^.]+))?\.(.+)$', "main.otherstuff") 
[('main', '', 'otherstuff')]