在文本之后匹配所有具有模式的行,直到模式匹配失败正则表达式

Match all lines with a pattern after a text until pattern matching failure regex

我有一条短信:


{{Verkleinerungsformen}}
:[1] [[Äpfelchen]], [[Äpfelein]], [[Äpflein]]

{{Oberbegriffe}}
:[1] [[Kernobst]], [[Obst]]; [[Frucht]]
:[4] [[Kot]]
:[7] [[Gut]]

{{Unterbegriffe}}
:[1] [[Augustapfel]], [[Bohnapfel]], [[Bratapfel]], [[Essapfel]], [[Fallapfel]], 


我有兴趣提取 {{Oberbegriffe}} 下具有模式 [[Text]] 的所有项目 包括所有行,直到它到达另一行在 begin

处没有 :[NUMBER-HERE]

所以在上面的例子中它应该 return 这些字符串的数组:

Kernobst, Obst, Frucht, Kot, Gut

我试过的是:

re.search(r'{{Oberbegriffe}}\n(?::?\n)?([^\n]+)', text)

但它只匹配完整的第一行。如果有一种方法可以提取所有带有模式的行并重新运行此字符串

:[1] [[Kernobst]], [[Obst]]; [[Frucht]]
:[4] [[Kot]]
:[7] [[Gut]]

您可以使用

提取方块
(?m)^{{Oberbegriffe}}(?:\n:\[\d+].*)*

regex demo

然后,使用\[\[([^][]+)]] 模式提取您需要的值。参见 this regex demo

正则表达式详细信息

  • (?m) - 内联修饰符,与 re.M / re.MULTILINE
  • 相同
  • ^ - 行首
  • {{Oberbegriffe}} - 文字
  • (?:\n:\[\d+].*)* - 0 次或多次重复的换行符后跟 :[,然后是 1+ 位数字,],然后是换行符以外的任何 0 次或更多字符,尽可能多。

第二个正则表达式 - \[\[([^][]+)]] - 匹配 [[,然后捕获组 #1 匹配 [] 以外的任何 1 个或多个字符,然后 ]].

在Python中:

with open(filepath, 'r') as fr:
  blocks = re.findall(r'^{{Oberbegriffe}}(?:\n:\[\d+].*)*', fr.read(), flags=re.M)
  print([re.findall(r'\[\[([^][]+)]]', block) for block in blocks])