目前正在使用带有瓶子的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>
答案 0 :(得分:2)
您实际上只需使用re.sub
方法一次即可修复问题,然后您不必保留任何变量,等等:
fixed_content = re.sub(r"(#[\d\w\.]+)", r"<strong class='hashtag'>\1</strong>", content)
您需要稍微更改正则表达式:
+
代替*
,以确保您不匹配内容中任何孤独的#
\g<1>
或\1
创建用于反向引用的捕获组。 \g<n>
和\n
是正则表达式世界中我们称之为“反向引用”的内容。您也可以拥有多个捕获组和多个反向引用 - \1
,\2
,\n
。根据{{3}}定义:
反向引用匹配以前与捕获组匹配的文本
每次需要重用其捕获组的匹配内容时,您都可以使用反向引用。在您的情况下,您希望保存实际的主题标签以供以后使用,因此您可以使用反向引用\n
而不是使用其他临时变量。
看一个简单的例子。假设你想要一个正则表达式用<strong>
替换HTML <b>
标签,你会得到以下正则表达式:
> pattern = re.compile(r"<strong>.+?</strong>")
这将匹配包含的<strong>
和</strong>
标签之间的所有内容。但是,您希望在这些标记之间重用实际元素。因此,让我们通过用括号括起元素匹配部分来创建一个捕获组:
> pattern = re.compile(r"<strong>(.+?)</strong>")
现在,您的捕获组内容可以与\1
一起重复使用。如果我们尝试将其与示例文本一起使用,则会发生以下情况:
> pattern.sub(r"<b>\1</b>", "some <strong>text</strong> example")
'some <b>text</b> example'
在处理替换和复杂的正则表达式时,反向引用非常有用。您可以阅读更多关于它们的this,还可以查看Python的here如何以更高级的方式使用它。