You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用正则提取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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.21 15:32:48