python - 制作 Markdown 解析器时的正则表达式问题

标签 python regex markdown

我正在尝试用 python 制作一个 markdown 解析器,不是因为它有用,而是因为它很有趣,因为我正在尝试学习正则表达式。

#! /usr/bin/env python
#-*- coding: utf-8 -*-

import re

class Converter:

    def markdown2html(self, string):

        string = re.sub('\*{3}(.+)\*{3}', '<strong>\\1</strong>', string)
        string = re.sub('\*{2}(.+)\*{2}', '<i>\\1</i>', string)
        string = re.sub('^#{1}(.+)$', '<h1>\\1</h1>', string, flags=re.MULTILINE)
        string = re.sub('^#{2}(.+)$', '<h2>\\1</h2>', string, flags=re.MULTILINE)

        return string

markdown_sting = """
##h2 heading
#H1 heading
This should be a ***bold*** char
#anohter h1
anohter ***bold***
this is a **italic** string
"""

converter = Converter()
print converter.markdown2html(markdown_sting)

打印

<h1>#h2 heading</h1>
<h1>H1 heading</h1>
This should be a <strong>bold</strong> char
<h1>anohter h1</h1>
anohter <strong>bold</strong>
this is a <i>italic</i> string

如您所见,它不解析 h2 标签。我哪里错了?

最佳答案

通过确保标题文本的第一个字符不是井号,您可以确保只匹配所需数量的井号。这可以通过使用 [^#] 来完成,如下所示:

string = re.sub('^#{1}([^#].*)$', '<h1>\\1</h1>', string, flags=re.MULTILINE)
string = re.sub('^#{2}([^#].*)$', '<h2>\\1</h2>', string, flags=re.MULTILINE)

这样规则的顺序就无关紧要了,使规则更加健壮。

关于python - 制作 Markdown 解析器时的正则表达式问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13361766/

相关文章:

regex - 带管道的 Perl 正则表达式

java - VBScript:正则表达式匹配不正确的注册表值时出错

html - 如何在 HTML knitr 文档的头部添加 javascript?

python - 每个机器人的IP不同吗?

python - 如何在 Python 中测试命令行应用程序?

确保文本仅包含格式为 $placeholder$ 的美元符号的 JavaScript 函数

markdown - 如何获得方程中某个数字正下方的数字?

css - Markdown - 将类添加到列表项

python - 在将文本向量参数输入到 sklearn 之前,如何将其与其他参数组合?

python - 如何从 Python 中的 stdout 中删除行 - 在 SciTe、Idle、Eclipse 或其他带有控制台的编辑器中