Python regex在分隔符之间重复捕获的组



我试图捕获某些分隔符之间的重复模式。字符串是这样的-

block 1
<some other text here>
element 1
element 2
element 3
<some other text here>
<some other text here>
exit
block 2
<some other text here>
element 1
element 2
<some other text here>
<some other text here>
exit

我想捕获块id以及其中的元素…每个块的元素数量可能不同,但结构是相同的。使用python regex。注:我不想使用re.findall或split。数据不是一直都是这样结构化的。这是一个巨大的块模式,在那里我试图了解如何重复正则表达式的一部分多次,也捕获所有的匹配。我尝试了这个- block (d+)(?:.|n)?((?):元素( d +) n) +) (?: | n)?退出 s +但这只捕获所有块中的第一个元素。请帮助regex101链接

由于您的块包含任意数量的元素,re.search()函数用圆括号捕获组将不适用。如果你没有如果你想用re.findall(),一个好的选择是双回路用re.finditer()

import re
str = '''
block 1
<some other text here>
element 1
element 2
element 3
<some other text here>
<some other text here>
exit
block 2
<some other text here>
element 1
element 2
<some other text here>
<some other text here>
exit
'''
for m1 in re.finditer(r'(block d+.*?exit)', str, re.DOTALL):
for m2 in re.finditer(r'(block d+|element d+)', m1.group(1)):
print(m2.group(1))
print('')           # just to put an empty line between blocks

输出:

block 1
element 1
element 2
element 3
block 2
element 1
element 2

如果要使用匹配的结果创建一个列表的列表,可以将代码的后半部分修改为:

blocks = []
for m1 in re.finditer(r'(block d+.*?exit)', str, re.DOTALL):
elements = []
for m2 in re.finditer(r'(block d+|element d+)', m1.group(1)):
elements.append(m2.group(1))
blocks.append(elements)
for bl in blocks:
for el in bl:
print(el)

相关内容

  • 没有找到相关文章

最新更新