我想用正则表达式提取一些模式。作为简化示例,我在下面有一些文本,我想为第二个字段提取不带下划线的文本:
main_opt.otherstuff应返回三个字段:"main"、"opt"、"otherstuff"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')]
