如何匹配双散列后的所有内容"#"直到下一个双散列"##"并包括任何重复的"#"字符不是"##&";。例如,下面的示例应该返回两个匹配项,一个用于第1章和第1.1章,另一个则用于第2章。
## chapter 1
Lorem ipsum dolor sit amet, consectetur adipiscing elit.
Suspendisse mollis magna nec felis gravida, id posuere libero molestie.
### subchapter 1.1
Sed vel ipsum eget tortor maximus ultrices vitae eget dolor.
## chapter 2
Aenean pellentesque lectus quis ex tristique ultrices. Vestibulum eget purus eu ipsum vestibulum pulvinar
目前,我发现最好的是以下正则表达式:
((?!#){2}[sS])+
然而,当发现###或####并将其计数为新章节时,这是混淆的。
regex示例链接:https://regex101.com/r/gydtq1/1
您可以使用
re.findall(r'(?ms)^##(?!#).*?(?=n##(?!#)|Z)', text)
re.findall(r'^##(?!#).*?(?=n##(?!#)|Z)', text, re.M | re.S)
请参阅regex演示详细信息:
(?ms)
-re.DOTALL
(re.S
(和re.MULTILINE
(re.M
(标志^
—线路起点##(?!#)
-未紧跟#
的##
字符串.*?
-零个或多个尽可能少的字符(?=n##(?!#)|Z)
-紧跟换行符的位置,##
不紧跟#
或字符串末尾
匹配感觉"高估的";有时,一种替代方案可能是
re.split(r'(?m)^##(?!#)', text)
部件与公认答案中的部件非常相似:
(?m)
-多行标志(可以作为第四个参数单独传递(^##(?!#)
-行(^
(开头的##
字符串,不紧跟其后的#
注意:生成的列表将有一个第一个##
之前的所有内容的条目,对于本例来说,这是一个空字符串。