Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/290.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 - Fatal编程技术网

Python 如何重复捕获组一次或多次并提取匹配项

Python 如何重复捕获组一次或多次并提取匹配项,python,regex,Python,Regex,是否可以使用一个正则表达式验证此字符串并提取所有名称: 输入: daz.Da zD.{Azd} .{AZDza}; D name:{franck}{steve}{louis} zefzef{z'f'z} fze fzef zef 乌普图特: [0]“法郎” [1] “史蒂夫” [2] “路易斯” 下面是我得到的:name:(?:{(.*?})但是我不知道如何重复(一个或多个)这个表达式(?:{(.*?})来提取name:之后的所有名称 我不想使用支持重复捕获组的python包。不使用单个正则

是否可以使用一个正则表达式验证此字符串并提取所有名称:

输入:

daz.Da zD.{Azd} .{AZDza}; D
name:{franck}{steve}{louis}
zefzef{z'f'z} fze fzef zef
乌普图特:

[0]“法郎”
[1] “史蒂夫”
[2] “路易斯”
下面是我得到的:
name:(?:{(.*?})
但是我不知道如何重复(一个或多个)这个表达式
(?:{(.*?})
来提取
name:
之后的所有名称


我不想使用支持重复捕获组的python包。

不使用单个正则表达式,但您可以这样做

>>> s = '''daz.Da zD.{Azd} .{AZDza}; D
name:{franck}{steve}{louis}
zefzef{z'f'z} fze fzef zef'''
>>> [j for i in re.findall(r'(?m)^name:(.*)', s) for j in re.findall(r'\{([^}]*)\}', i)]
['franck', 'steve', 'louis']
这将从以
name:

使用
startswith

>>> s = '''daz.Da zD.{Azd} .{AZDza}; D
name:{franck}{steve}{louis}
zefzef{z'f'z} fze fzef zef'''.splitlines()
>>> [j for line in s  for j in re.findall(r'\{([^}]*)\}', line) if line.startswith('name')]
['franck', 'steve', 'louis']

您可以使用带有的
\G
锚点链接匹配

它在每个搜索开始/继续的位置匹配

  • (?:名称:|\G(?!^))
    第一部分:匹配
    名称:
    字面上的
    |\G
    或在最后一个匹配结束的地方继续,开始时
    (?!^)

  • {([^}]+)}
    第二部分:捕获
    }
    内部
    {
    ..
    }
    到$1,并粘贴到成功的上一个匹配项

regex.findall一起使用


可能重复的谢谢!这就是我想要的!:)使用regex包,您可以做得更简单,因为它能够存储重复捕获组的结果。您可以将此简单模式与
search
方法一起使用:
name:(?:{([^}]+)})+
并使用
m.captures(1)
获取结果列表。
(?:name:|\G(?!^)){([^}]+)}