Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在同一行中分隔多个正则表达式匹配项_Python_Regex_Regex Group - Fatal编程技术网

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

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

我试图使用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###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")]

如果你想把它展平,这也很简单。

在这个问题上有几点需要考虑

  • 首先是percisely
    re.match()
    所做的。该函数实际上希望能够在字符串的开头开始一个匹配,在这种情况下它不能,因为这里有一个左括号。因此,您需要查看
    re.search()
    ,更可能的是,
    re.findall()
    功能
  • 此外,您不需要像在其他语言中那样在Python中转义组
  • 您可能不想使用
    *
    ,因为这往往是贪婪的。虽然您可以使用
    *?
    ,但最好花点时间给正则表达式一个更具体的搜索
  • 总之,我建议如下:

    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')