Python 正则表达式匹配段落

Python Regex Match Paragraphs

我有一个如下所示的字符串:

...

Art. 15 Gegenstand Dieses Gesetz regelt die Bekämpfung der Geldwäscherei im Sinne von Artikel 305 bis des Strafgesetzbuches6 (StGB), die Bekämpfung der Terrorismusfinanzierung im Sinne von Artikel 260quinquies Absatz 1 StGB und die Sicherstellung der Sorgfalt bei Finanzgeschäften.

Art. 22 Geltungsbereich 1 Dieses Gesetz gilt: a. für Finanzintermediäre; b. für natürliche und juristische Personen, die gewerblich mit Gütern handeln und dabei Bargeld entgegennehmen (Händlerinnen und Händler).

...

我正在尝试将字符串拆分为来自 Art 的部分。 XX到下一个艺术。 XX.

因此,例如,第一个匹配项应包含字符串:

Art. 15 Gegenstand Dieses Gesetz regelt die Bekämpfung der Geldwäscherei im Sinne von Artikel 305 bis des Strafgesetzbuches6 (StGB), die Bekämpfung der Terrorismusfinanzierung im Sinne von Artikel 260quinquies Absatz 1 StGB und die Sicherstellung der Sorgfalt bei Finanzgeschäften.

我试过这个:

x = re.findall(r"Art\. (?s).*(?=Art)",text);

还有这个:

x = re.findall(r"Art\. .+(\n.*)*(?=Art)*",text);

但似乎没有按预期工作... 另外我不确定我应该使用 findall 还是 split。

首先,在模式中使用捕获组并将其传递给 re.findall 。接下来,您不应该尝试量化环视,这没有任何意义,而且通常被视为用户错误。 Python 中的 (?=Art)* 将被视为没有 (?=Art)*,因为它表示 "there can be Art or there can be no Art"。就像没有前瞻一样。

您可以使用

result = re.findall(r'(?m)^Art\..*(?:\n(?!Art\.).*)*', text)

regex demo

详情

  • (?m)^ - 行首
  • Art\. - Art. 字符串
  • .* - 该行的其余部分
  • (?:\n(?!Art\.).*)* - 0 个或多个不以 Art.
  • 开头的行