Python正则表达式匹配后可能的匹配

Python正则表达式匹配后可能的匹配,python,regex,Python,Regex,我有这样的图案 name: steven add: hyderabad add: India name: samuel add: chennai add: tamilnadu add: India ... 地址行(添加:)可能会有所不同。如何编写正则表达式来捕获名称和地址内容 请注意,每条记录用\n\n分隔,每条记录的每一行用新行分隔 提前感谢我认为最简单的方法是完全避免使用正则表达式,而只使用生成器。我们可以在每个名称后面累加行,然后成对地生成它们 def gen(file):

我有这样的图案

name: steven
add: hyderabad
add: India

name: samuel
add: chennai
add: tamilnadu
add: India


...
地址行(添加:)可能会有所不同。如何编写正则表达式来捕获名称和地址内容

请注意,每条记录用
\n\n
分隔,每条记录的每一行用新行分隔


提前感谢

我认为最简单的方法是完全避免使用正则表达式,而只使用生成器。我们可以在每个名称后面累加行,然后成对地生成它们

def gen(file):
    name = None
    addresses = []
    for line in file:
        if line.startswith('name'):
            name = line.split(':')[1].strip()
        elif line.startswith('add'):
            addresses.append(line.split(':')[1].strip())
        else:
            if name is not None:
                yield (name, addresses)
                name, addresses = None, []
    if name is not None:
         yield (name, addresses)

with open(filename) as f:
    print(list(gen(f)))

 # [('steven', ['hyderabad', 'India']), ('samuel', ['chennai', 'tamilnadu', 'India'])]

您可以使用
re
解析输入数据:

data = """
name: steven
add: hyderabad
add: India

name: samuel
add: chennai
add: tamilnadu
add: India
"""

import re

for group in re.findall(r'(name:.*?)(?:(?=name:)|\Z)', data, flags=re.DOTALL):
    name = re.findall(r'(?:name:\s*([^\n]+))', group, flags=re.DOTALL)
    addresses = re.findall(r'(?:add:\s*([^\n]+))+', group, flags=re.DOTALL)
    print(name[0], addresses)
    print('-' * 80)
印刷品:

steven ['hyderabad', 'India']
--------------------------------------------------------------------------------
samuel ['chennai', 'tamilnadu', 'India']
--------------------------------------------------------------------------------

尝试以下模式:
name:[a-zA-Z]+\n(添加:[a-zA-Z0-9]+\n)+

它捕捉到这种结构的组:

name: ...
add: ...
...
add: ...

到目前为止您尝试了什么?关于findall(r'name:(.*)\n(add:(.*)\n)”,数据)。我可以提取名称,但可以访问单个add行。虽然我喜欢在函数中编写,但我想通过正则表达式检查是否可能更简单