将多个不同的主题标签转换为与python的链接

时间:2017-04-13 12:01:15

标签: python sql 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>

1 个答案:

答案 0 :(得分:2)

您实际上只需使用re.sub方法一次即可修复问题,然后您不必保留任何变量,等等:

fixed_content = re.sub(r"(#[\d\w\.]+)", r"<strong class='hashtag'>\1</strong>", content)

您需要稍微更改正则表达式:

  1. 使用+代替*,以确保您不匹配内容中任何孤独的#
  2. 在主题标签匹配部分周围添加括号,以便随后使用\g<1>\1创建用于反向引用的捕获组。
  3. \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如何以更高级的方式使用它。