如何在同一行中分隔多个正则表达式匹配

lim*_*imp 2 python regex regex-group

我正在尝试使用正则表达式来解析以某种(key###value)格式编写的值。该值始终是一个数字。不管怎样,我认为用 python 来做是最简单的,所以这里是我正在尝试的一些代码:

import re

line = "(text 1###123)(text 2###345)";

matchObj = re.match( r'\(.*###[0-9]+\)', line)

if matchObj:
   print matchObj.group(0) # produces (text 1###123)(text 2###345)
   # print matchObj.group(1) # gives an error
else:
   print "No match!!"
Run Code Online (Sandbox Code Playgroud)

尽管有两个不同的对象与我编写的正则表达式匹配,但 python 将它们作为单个字符串返回给我——这不是我想要的。我怎样才能解决这个问题?

事实上,我真正想要的是将字符串分成类似["text 1", "123", "text 2", "345]. 因此,如果有人有一个简单的方法来实现这一点,我也将不胜感激。

Jef*_*ner 5

您没有合适的正则表达式,您需要有捕获组。你的例子已经转义了括号。这是您实际需要的正则表达式。之后?*使其变得非贪婪(以便它在仍然匹配的情况下尝试采用尽可能少的字符)。

\((.*?)###([0-9]+)\)
Run Code Online (Sandbox Code Playgroud)

您当前的正则表达式仅具有转义括号,因此您实际上没有任何捕获组。要获得所有匹配项,您需要使用re.findall. 但如果您需要使用两个捕获组,这将产生如下所示的结果:

regex = r'\((.*?)###([0-9]+)\)'
re.findall(regex, "(text 1###123)(text 2###345)") # [("text 1", "123"), ("text 2", "345")]
Run Code Online (Sandbox Code Playgroud)

如果你想把它压平,那也很简单。