使用正则提取Markdown代码时末尾多出反引号的问题求解
解决Markdown代码块提取末尾多反引号的问题
问题原因
你使用的负向前瞻(?!.*```)逻辑有误:非贪婪匹配.*?会不断向前匹配,直到找到一个位置,该位置之后不存在完整的三个反引号。当匹配到代码块结尾的第一个反引号时,后面只剩两个反引号,刚好满足“无完整三个”的条件,因此这个反引号被错误地包含进了匹配结果。
修复方案
方案1:利用规范Markdown代码块的闭合特性
Markdown规范中,代码块的闭合标记```通常单独占一行,我们可以基于这个规则编写正则:
import re string = """ Lorem ipsum ```python print('foo```bar```foo') print('foo```bar```foo')
Lorem ipsum
"""
匹配开头的
(可选语言标识),然后匹配内容直到单独一行的闭合 pattern = r'(?:\w+\n)?([\s\S]*?)(?=\n)'
result = re.search(pattern, string, re.DOTALL).group(1)
print(result)
#### 方案2:兼容非规范写法(闭合标记与代码同行) 如果遇到不规范的Markdown(闭合标记和最后一行代码在同一行),可以用否定后行断言区分内容里的` ``` `和闭合标记: ```python pattern = r'```(?:\w+\n)?([\s\S]*?)(?<!`)```'
(?<!)用于确保匹配到的闭合 ``` `前面不是单个反引号,避免误匹配代码内容里的反引号组合。
测试结果
两种方案都能正确提取代码,输出结果为:
print('foo```bar```foo') print('foo```bar```foo')
内容的提问来源于stack exchange,提问作者Sean Bannister
相关产品推荐
相关产品推荐

