在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
})
从之前回答的问题中找不到我的问题的任何解决方案。我想通过替换将所有用符号包裹的单词转换为相应的文本(简而言之,降价为 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
})