如何将 Markdown 转换为纯文本
为什么需要 Markdown 转纯文本
Markdown 是优秀的轻量级标记语言,但在某些场景下,包含 Markdown 标记的文本需要转换为干净的纯文本:将文档内容复制到不支持 Markdown 的系统(如老版 CRM、ERP);为语音合成 TTS 准备文本内容;提取文章正文用于 SEO 分析或字数统计;导出到 PDF 时使用的中间步骤;为非技术人员提供纯文本版本。
需要去除的 Markdown 元素
- 标题标记:# H1, ## H2, ### H3 等(去除 # 符号,保留文字)
- 粗体和斜体:粗体、斜体、粗体(去除 * 和 _ 符号)
- 链接:链接文本(通常保留链接文本,删除 URL 和括号)
- 图片:(保留 alt 文本或完全删除)
- 代码块:反引号包围的内联代码和代码块(保留代码内容,删除反引号)
- 列表标记:- 和 * 列表、数字编号列表(删除标记符号或转为纯文本)
- 引用块:> 引用(去除 > 符号)
- 水平分割线:--- 或 *** (删除或替换为空行)
Python 代码实现
import re
def markdown_to_plain(text):
# 删除标题 #
text = re.sub(r'^#{1,6}\s+', '', text, flags=re.MULTILINE)
# 删除粗体和斜体标记(保留文字)
text = re.sub(r'\*\*(.+?)\*\*', r'\1', text) # **粗体**
text = re.sub(r'\*(.+?)\*', r'\1', text) # *斜体*
text = re.sub(r'__(.+?)__', r'\1', text) # __粗体__
text = re.sub(r'_(.+?)_', r'\1', text) # _斜体_
# 处理链接:[文字](URL) -> 文字
text = re.sub(r'\[(.+?)\]\(.+?\)', r'\1', text)
# 删除图片: -> alt 或完全删除
text = re.sub(r'!\[(.+?)\]\(.+?\)', r'\1', text)
# 删除代码块反引号
text = re.sub(r'```[\w]*\n?', '', text)
text = re.sub(r'`(.+?)`', r'\1', text)
# 删除引用块 >
text = re.sub(r'^>\s?', '', text, flags=re.MULTILINE)
# 删除水平分割线
text = re.sub(r'^[-*]{3,}\s*$', '', text, flags=re.MULTILINE)
# 删除列表标记(保留内容)
text = re.sub(r'^[\*\-\+]\s+', '', text, flags=re.MULTILINE)
text = re.sub(r'^\d+\.\s+', '', text, flags=re.MULTILINE)
return text.strip()
使用现有库转换
手写正则表达式处理所有 Markdown 语法边缘情况很复杂。推荐使用现有库:Python 的 markdown 库(先转为 HTML,再用 BeautifulSoup 提取纯文本);或者直接使用 markdownify 逆向库;JavaScript 中的 remark 系列工具链。这些库能正确处理嵌套结构、转义字符和各种 Markdown 方言(CommonMark、GFM 等)。
Pandoc 命令行转换
# 使用 Pandoc 将 Markdown 转为纯文本
pandoc input.md -t plain -o output.txt
# 转为 HTML(中间步骤)
pandoc input.md -t html -o output.html
# 批量转换目录中的所有 .md 文件
for f in *.md; do pandoc "$f" -t plain -o "${f%.md}.txt"; done
保留结构 vs 完全去除
根据目标用途,选择不同的转换策略:完全去除所有格式(适合 TTS、简单文本分析);保留基本结构(标题用空行分隔,列表用缩进,适合可读性要求较高的纯文本);转为 reStructuredText 或其他轻量标记语言(适合需要保留结构但换用其他格式的场景)。
反向操作:纯文本转 Markdown
有时候需要将已有的纯文本内容转换为 Markdown 格式(如将旧文档迁移到博客系统)。自动转换很难做到完美,但可以半自动处理:用脚本将段落按首行格式推断为标题,将行首短横线转为列表,将大写单词推断为强调内容。最终仍需人工审核,自动化只是减少工作量。
立即免费使用相关工具
免费使用 →