在python、django中将多个替换与正则表达式结合起来

Combining multiple substitutions with regular expressions in python, django

从之前回答的问题中找不到我的问题的任何解决方案。我想通过替换将所有用符号包裹的单词转换为相应的文本(简而言之,降价为 HTML)。这些是我匹配标题、副标题、斜体文本等的模式:

patterns = [re.compile(r'(^#)(\s?[^#].+\s)'),           # title
            re.compile(r'(##)(\s?.+\n)'),               # subtitle
            re.compile(r'(\s)(\*)([^*\n]+)(\*)'),       # italic
            re.compile(r'(\s\*\*)([^*]+)*(\*\*)'),      # boldface
            re.compile(r'(\*\*\*)(.+)(\*\*\*)'),        # bold italic
            re.compile(r'(\n)'),                        # paragraph
            re.compile(r'(\*|-)(\s\w+.\w+.)'),          # list
            re.compile(r'(\[([^[\]]+)\]\(([^)]+)\))')]  # link

这是我在 Django 的 views.py 中的函数:

def entry(request, title):
    if title not in util.list_entries():
        return render(request, "encyclopedia/error.html", {
            "error": "Page Not Found",
            "query": title
        })
    else:

        return render(request, "encyclopedia/entry.html", {
            "entry": util.get_entry(title),
            "title": title
        })

仅供参考,此函数通过上下文 ("entry": util.get_entry(title)) 向我显示页面内容,这些内容将传递给模板。目前,该页面向我显示降价内容,带符号的文本。功能和其他相关的功能都很好,所以不需要改变它们(不需要关注这部分)。

如果我通过放置我的一种模式(如 "entry": p3.sub(r'replacement', util.get_entry(title)))在上下文中更改字典,它也可以正常工作。但关键是我想组合我所有的模式,所有的替换都需要在文本中一次性完成。我该怎么做?

PS 我知道 markdown2 包并在不使用它的情况下寻找解决方案,仅使用正则表达式。

提前致谢。

所以,我的问题的答案是下面的代码:

def entry(request, title):

    if title not in util.list_entries():
        return render(request, "encyclopedia/error.html", {
            "error": "Page Not Found",
            "query": title
        })
    else:
        page = util.get_entry(title)

        # List of patterns to be found
        patterns = [re.compile(r'(^#)(\s?[^#].+\s)'),           # title
                    re.compile(r'(##)(\s?.+\n)'),               # subtitle
                    re.compile(r'(\s)(\*)([^*\n]+)(\*)'),       # italic
                    re.compile(r'(\s\*\*)([^*]+)*(\*\*)'),      # boldface
                    re.compile(r'(\*\*\*)(.+)(\*\*\*)'),        # bold italic
                    re.compile(r'(\n)'),                        # paragraph
                    re.compile(r'(\*|-)(\s\w+.\w+.)'),          # list
                    re.compile(r'(\[([^[\]]+)\]\(([^)]+)\))')]  # link

        # List of replacements for each pattern
        replace = [patterns[0].sub(r'', r'<h1></h1>'),
                   patterns[1].sub(r'', r'<h2></h2>'),
                   patterns[2].sub(r'', r'<i> </i>'),
                   patterns[3].sub(r'', r'<b> </b>'),
                   patterns[4].sub(r'', r'<b><i></i></b>'),
                   patterns[5].sub(r'', r'<p>'),
                   patterns[6].sub(r'', r'<li></li>'),
                   patterns[7].sub(r'', r'<a href=""></a>')]
        count = 0
        for match in patterns:
            replaced = match.sub(f'{replace[count]}', page)
            page = replaced
            count = count + 1

        return render(request, "encyclopedia/entry.html", {
            "entry": page,
            "title": title
        })