将多个不同的主题标签转换为 python 的链接
Turning multiple different hashtags to links with python
目前正在使用 Bottle 开发 Web 服务器,并尝试实现接受消息并将其转换为 HTML 适合显示的功能。
有限制
Any hashtags in the text ('#' followed by a sequence of letters, numbers or periods)
are enclosed by a <strong class='hashtag'> tag.
Eg. <strong class='hashtag'>#whatever</strong>
我遇到的问题是当一段文本中有多个主题标签时,因为使用正则表达式可以让我找到特定的主题标签块,但 re.sub 将所有主题标签替换为一个值给出。
这是我拥有的:
def post_to_html(content):
if (re.search(r'#[\d\w\.]*', content) is not None):
hold = re.search(r'#[\d\w\.]*', content).group(0)
repltxt = "<strong class='hashtag'>{0}</strong>".format(hold)
hold = re.sub(r'#[\d\w\.]*', repltxt, content)
content = hold
给出时:
"#whatever you #want"
输出:
<strong class='hashtag'>#whatever</strong> you <strong class='hashtag'>#whatever</strong>
实际上,您只需使用 re.sub
方法一次就可以解决您的问题,而且您不必保存任何变量等等:
fixed_content = re.sub(r"(#[\d\w\.]+)", r"<strong class='hashtag'></strong>", content)
您确实需要稍微更改一下正则表达式:
- 使用
+
而不是 *
以确保您不会匹配内容中的任何孤独 #
- 在 hashtag 匹配部分周围添加括号以创建一个捕获组,以便之后使用
\g<1>
或 </code> 进行反向引用。</li>
</ol>
<p> <code>\g<n>
和 \n
就是我们在正则表达式世界中所说的 "backreferences"。您也可以有多个捕获组和多个反向引用 - </code>、<code>
、\n
。根据this定义:
Backreferences match the same text as previously matched by a capturing group
每次需要重用其捕获组的匹配内容时,您都可以使用反向引用。在您的情况下,您想保存实际的主题标签供以后使用,因此您可以只使用反向引用 \n
而不是使用额外的临时变量。
看一个简单的例子。假设你想要一个正则表达式来用 <b>
替换 HTML <strong>
标签,你想出了以下正则表达式:
> pattern = re.compile(r"<strong>.+?</strong>")
这将匹配 <strong>
和 </strong>
之间的所有内容,包括标签。但是,您希望重用这些标签之间的实际元素。那么让我们通过用括号包围元素匹配部分来创建一个捕获组:
> pattern = re.compile(r"<strong>(.+?)</strong>")
现在,您的捕获组的内容可以在 </code> 中重复使用。如果我们尝试将它与示例文本一起使用,就会发生这种情况:</p>
<pre><code>> pattern.sub(r"<b></b>", "some <strong>text</strong> example")
'some <b>text</b> example'
反向引用在处理替换和复杂的正则表达式时非常有用。您可以阅读更多关于它们的信息 here and also check Python's documentation,了解如何以更高级的方式使用它。
目前正在使用 Bottle 开发 Web 服务器,并尝试实现接受消息并将其转换为 HTML 适合显示的功能。 有限制
Any hashtags in the text ('#' followed by a sequence of letters, numbers or periods)
are enclosed by a <strong class='hashtag'> tag.
Eg. <strong class='hashtag'>#whatever</strong>
我遇到的问题是当一段文本中有多个主题标签时,因为使用正则表达式可以让我找到特定的主题标签块,但 re.sub 将所有主题标签替换为一个值给出。 这是我拥有的:
def post_to_html(content):
if (re.search(r'#[\d\w\.]*', content) is not None):
hold = re.search(r'#[\d\w\.]*', content).group(0)
repltxt = "<strong class='hashtag'>{0}</strong>".format(hold)
hold = re.sub(r'#[\d\w\.]*', repltxt, content)
content = hold
给出时:
"#whatever you #want"
输出:
<strong class='hashtag'>#whatever</strong> you <strong class='hashtag'>#whatever</strong>
实际上,您只需使用 re.sub
方法一次就可以解决您的问题,而且您不必保存任何变量等等:
fixed_content = re.sub(r"(#[\d\w\.]+)", r"<strong class='hashtag'></strong>", content)
您确实需要稍微更改一下正则表达式:
- 使用
+
而不是*
以确保您不会匹配内容中的任何孤独#
- 在 hashtag 匹配部分周围添加括号以创建一个捕获组,以便之后使用
\g<1>
或</code> 进行反向引用。</li> </ol> <p> <code>\g<n>
和\n
就是我们在正则表达式世界中所说的 "backreferences"。您也可以有多个捕获组和多个反向引用 -</code>、<code>
、\n
。根据this定义:Backreferences match the same text as previously matched by a capturing group
每次需要重用其捕获组的匹配内容时,您都可以使用反向引用。在您的情况下,您想保存实际的主题标签供以后使用,因此您可以只使用反向引用
\n
而不是使用额外的临时变量。看一个简单的例子。假设你想要一个正则表达式来用
<b>
替换 HTML<strong>
标签,你想出了以下正则表达式:> pattern = re.compile(r"<strong>.+?</strong>")
这将匹配
<strong>
和</strong>
之间的所有内容,包括标签。但是,您希望重用这些标签之间的实际元素。那么让我们通过用括号包围元素匹配部分来创建一个捕获组:> pattern = re.compile(r"<strong>(.+?)</strong>")
现在,您的捕获组的内容可以在
</code> 中重复使用。如果我们尝试将它与示例文本一起使用,就会发生这种情况:</p> <pre><code>> pattern.sub(r"<b></b>", "some <strong>text</strong> example") 'some <b>text</b> example'
反向引用在处理替换和复杂的正则表达式时非常有用。您可以阅读更多关于它们的信息 here and also check Python's documentation,了解如何以更高级的方式使用它。