Python 如何在同一行中分隔多个正则表达式匹配项
我试图使用regex解析以Python 如何在同一行中分隔多个正则表达式匹配项,python,regex,regex-group,Python,Regex,Regex Group,我试图使用regex解析以(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###1
(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!!"
尽管有两个不同的对象与我编写的正则表达式相匹配,python还是将它们作为单个字符串返回给我——这不是我想要的。我怎样才能解决这个问题
事实上,我真正想要的是将字符串分割成类似
[“text 1”、“123”、“text 2”、“345]
。因此,如果有人有一个简单的方法来实现这一点,我也会非常感激。你没有合适的正则表达式,你需要有捕获组。你的例子中有parens转义。以下是你实际需要的正则表达式。*
之后的?
使它不贪婪(因此,它会在仍然匹配的情况下尝试使用尽可能少的字符)
您当前的正则表达式只有转义参数,因此您实际上没有任何捕获组。要获取所有匹配项,您需要使用re.findall
。但是如果您需要使用两个捕获组,这将产生如下结果:
regex = r'\((.*?)###([0-9]+)\)'
re.findall(regex, "(text 1###123)(text 2###345)") # [("text 1", "123"), ("text 2", "345")]
如果你想把它展平,这也很简单。在这个问题上有几点需要考虑
re.match()
所做的。该函数实际上希望能够在字符串的开头开始一个匹配,在这种情况下它不能,因为这里有一个左括号。因此,您需要查看re.search()
,更可能的是,re.findall()
功能*
,因为这往往是贪婪的。虽然您可以使用*?
,但最好花点时间给正则表达式一个更具体的搜索matchObj = re.findall(r'(([\w\d ]+)###(\d+))', line)
这将产生一个易于排序的数组:
>>> matchObj
[('text 1###123', 'text 1', '123'), ('text 2###345', 'text 2', '345')]
>>> matchObj[0]
('text 1###123', 'text 1', '123')
非贪婪的
(.*)
在这里是必要的,否则findall
返回[('text 1####123)(text 2','345')]
@JanneKarila很好。我想我最初是把它作为[^]来的*
然后决定做太多的假设,所以没有考虑就回到了*
。\(
是为了匹配开头部分,所以重新匹配()
应该可以工作,但它只返回一个结果。如果您将转义添加到我的第一个和最后一个参数,那么您的结果可能会更好:[('text 1','123'),('text 2','345')]
>>> matchObj
[('text 1###123', 'text 1', '123'), ('text 2###345', 'text 2', '345')]
>>> matchObj[0]
('text 1###123', 'text 1', '123')