Regex匹配双##,包括任何非双的#重复



如何匹配双散列后的所有内容"#"直到下一个双散列"##"并包括任何重复的"#"字符不是"##&";。例如,下面的示例应该返回两个匹配项,一个用于第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)-多行标志(可以作为第四个参数单独传递(
  • ^##(?!#)-行(^(开头的##字符串,不紧跟其后的#

注意:生成的列表将有一个第一个##之前的所有内容的条目,对于本例来说,这是一个空字符串。

最新更新