← 返回博客

如何将 Markdown 转换为纯文本

2026-04-18 · 5 分钟阅读

为什么需要 Markdown 转纯文本

Markdown 是优秀的轻量级标记语言,但在某些场景下,包含 Markdown 标记的文本需要转换为干净的纯文本:将文档内容复制到不支持 Markdown 的系统(如老版 CRM、ERP);为语音合成 TTS 准备文本内容;提取文章正文用于 SEO 分析或字数统计;导出到 PDF 时使用的中间步骤;为非技术人员提供纯文本版本。

需要去除的 Markdown 元素

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](URL) -> 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 格式(如将旧文档迁移到博客系统)。自动转换很难做到完美,但可以半自动处理:用脚本将段落按首行格式推断为标题,将行首短横线转为列表,将大写单词推断为强调内容。最终仍需人工审核,自动化只是减少工作量。

立即免费使用相关工具

免费使用 →