Python 匹配正则表达式而不捕获
我想用正则表达式提取一些模式。作为简化的示例,我在下面有几段文本,我希望在第二个字段中提取不带下划线的文本:Python 匹配正则表达式而不捕获,python,regex,Python,Regex,我想用正则表达式提取一些模式。作为简化的示例,我在下面有几段文本,我希望在第二个字段中提取不带下划线的文本: main\u opt.otherstuff应返回三个字段:“main”,“opt”,“otherstuff” main.otherstuff应返回三个字段:“main”,“otherstuff” 如果我将正则表达式指定为^([^\u]+)?([^.]+)?\\\.(.+)$,则可以得到此结果。但是,我想知道是否可以更改此模式([^.]+)?,其中只指定了一个?,因为它们是同一子模式的一部
main\u opt.otherstuff
应返回三个字段:“main”
,“opt”
,“otherstuff”
main.otherstuff
应返回三个字段:“main”
,“otherstuff”
^([^\u]+)?([^.]+)?\\\.(.+)$
,则可以得到此结果。但是,我想知道是否可以更改此模式([^.]+)?
,其中只指定了一个?
,因为它们是同一子模式的一部分
我试过
([^.]+)((?=\\[^.]+)?\\.(.+)$
和([^.]+)((?:\[^.]+)?\.(.+)$
,但第二个字段返回“\u opt”而不是“opt”。(我正在使用python的re
包,如果有必要的话。)您可以将它们分组到非捕获组(?:…)
,但它不会比您的原始解决方案更漂亮:
^([^_]+)(?:_([^.]+))?\\.(.+)$
看
在Python控制台上测试:
>>> re.findall(r'^([^_]+)(?:_([^.]+))?\.(.+)$', "main_opt.otherstuff")
[('main', 'opt', 'otherstuff')]
>>> re.findall(r'^([^_]+)(?:_([^.]+))?\.(.+)$', "main.otherstuff")
[('main', '', 'otherstuff')]
拆分可能会简化方法:
>>> re.split(r'_|\.', 'main_opt.otherstuff')
['main', 'opt', 'otherstuff']
>>> re.split(r'_|\.', 'main.otherstuff')
['main', 'otherstuff']
我认为不使用正则表达式,只需拆分两次,就可以更简单地实现这一点
mainopt, _, otherstuff = wholething.partition('.')
main, _, opt = mainopt.partition('_')
以下是这对不同输入的作用:
`"main_opt.otherstuff"` -> `"main"`, `"opt"`, `"otherstuff"`
`"main.otherstuff"` -> `"main"`, `""`, `"otherstuff"`
`"main_opt"` -> `"main"`, `"opt"`, `""`
如果需要不同的优先级,可以更改顺序;如果需要不同的关联性,可以将一个或另一个
分区
调用替换为r分区
(例如,如果最后一个示例应给出,,,“main\u opt”
).regex101行为并不总是与实际行为相同。您应该使用python控制台进行测试。我仍然得到相同的结果。。。在控制台上添加了完整的结果,感谢您的反馈我相信(?:s)?他不想要一个空的第二个捕获组,但可能我还不太了解要求。我引用他的话:“main.otherstuff应该返回三个字段:“main”,“otherstuff”,“Ok,在这种情况下,您应该在第一个字符类中排除圆点,以使模式更具性能(减少回溯),为什么不呢,但是这并不能保证组数(少于4组,多于1组)。我请OP澄清他是否希望在所有情况下都有3组。也许我是个笨蛋,但这篇文章对我来说并不清楚。就像这里的很多帖子一样。“main”、“,”otherstuff”
是想要的结果还是你只是在报告结果?@dawg:是的,这三个字段是我想要的结果。