Regex -标识一个唯一的数字以停止匹配

u4dcyp6a  于 2023-06-30  发布在  其他
关注(0)|答案(2)|浏览(77)

我正尝试使用正则表达式来分割文本主体,基于识别文本中的节号。我用它来识别节号的开始,并捕获匹配中的所有后续文本,直到下一个节号。文本正文的一个示例可能是这样的,其中§ 1.XX-X标识该节:

§ 1.11-1 text
text
text
§ 1.15-1 text
text
text
§ 1.21-1 text
text
text
§ 1.21-2 text
text
text
§ 1.21-3 text
text
text

我目前使用的模式是(^§\s1\.\d{1,4}.+?)(?=^§\s1\.\d{1,4}),它为每个部分创建一个匹配。但是,只有当紧跟着句号的数字是唯一的时,我才需要新的匹配。所以在这个例子中,这些数字是11,15和21;所以我希望我的配对是

Match 1:
§ 1.11-1 text
text
text
Match 2:
§ 1.15-1 text
text
text
Match 3:
§ 1.21-1 text
text
text
§ 1.21-2 text
text
text
§ 1.21-3 text
text
text
yxyvkwin

yxyvkwin1#

如果不使用点匹配换行符,您可以使用捕获组(§\s1\.\d{1,4})\b来匹配例如§ 1.21这样的部分。
然后匹配所有不以该模式§\s1\.\d{1,4}\b开头的行
匹配之后,可以选择使用反向引用\1和相同的匹配逻辑再次重复以捕获组1中的值开始的所有行。

^(§\s1\.\d{1,4})\b.*(?:\n(?!§\s1\.\d{1,4}\b).*)*(?:\n\1.*(?:\n(?!§\s1\.\d{1,4}\b).*)*)*

查看regex demo(注意,它启用了多行标志)

gupuwyp2

gupuwyp22#

这个正则表达式不能在regex 101上工作,但可以在Notepad++和python上工作。

正则表达式:

§ (\d\.\d+)-\d+ (.*\r?\n)*?(?=§ |$)(?!§ \1)

难点:

1.稍后要使用\1比较的捕获组:

(\d\.\d+)

1.匹配行但不贪婪:

(.*\r?\n)*?
  1. lookahead查看匹配“§“的行:
(?=§ |$)

但不匹配“§“后跟与第一个捕获组相同的数字:

(?!§ \1)

1.该“|$”用于下一行没有“§“的最后一个匹配。

python代码:

import re

str = """§ 1.11-1 text
text
text
§ 1.15-1 text
text
text
§ 1.21-1 text
text
text
§ 1.21-2 text
text
text
§ 1.21-3 text
text
text
"""

matches = re.finditer(r'§ (\d\.\d+)-\d+ (.*\r?\n)*?(?=§ |$)(?!§ \1)', str)

for match in matches:
    print(match.group(0))

相关问题