在文本之后匹配所有具有模式的行,直到模式匹配失败正则表达式
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+].*)*
然后,使用\[\[([^][]+)]]
模式提取您需要的值。参见 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])
我有一条短信:
{{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+].*)*
然后,使用\[\[([^][]+)]]
模式提取您需要的值。参见 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])