1

Python でマークダウン パーサーを作成しようとしていますが、これは便利だからではなく、楽しいからであり、正規表現を学ぼうとしているからです。

#! /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 タグは解析されません。どこで間違ったのですか?

4

4 に答える 4

4

パーサーがを見ると#、の代わりになりh1ます。次に、の置換を試みますが、部分を解析するときにハッシュ()の1つがすでに置き換えられているためh2、文字列はありません。##'#'h1

簡単な修正は、注文を交換することです。

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

一般に、データに変換を適用する場合、これらの問題を回避するために、データを最も制限の厳しいものから最も制限の少ないものの順に並べる必要があります。

于 2012-11-13T13:43:57.407 に答える
4

見出しテキストの最初の文字がハッシュ記号でないことを確認することで、必要な数のハッシュ記号のみが一致するようにすることができます。[^#]これは、次のように使用して実行できます。

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

この方法では、ルールの順序は重要ではなく、ルールがより堅牢になります。

于 2012-11-13T14:02:40.050 に答える
1

より適切で効率的な方法は、文字列の最初の文字を比較してから、単純な文字列置換を実行することです。

def markdown2html(self, string):

    if string[0:2] == "##":
        string = string.replace( "##", "<h2>" ) + "</h2>"
    if string[0] == "#":
        string = string.replace( "##", "<h1>" ) + "</h1>"
    return string

そうすれば、正規表現ではなく単純なリスト操作を行うことができます。しかし、すべての場合において、順序は重要です

于 2012-11-13T13:49:18.843 に答える
1

これらの正規表現は順番に評価されます。h1正規表現は、#で始まる行を取得し、それをに変換し<h1>ます。したがって、h2正規表現に到達するまでに、行は##で始まらなくなります。これらの2つの式を入れ替えます。

于 2012-11-13T13:44:13.257 に答える