2017-04-13 64 views
2

当前正在使用瓶子的Web服务器上工作,并尝试实现接受消息并将其转换为适合显示的HTML的函数。 还有就是将多个不同的主题标签转化为与python的链接

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

实际上,你可以用re.sub方法只有一个使用情况,然后解决您的问题你不必保留任何变量等等:

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

你需要改变你的正则表达式位:

  1. 使用+代替*以确保您不匹配的任何内容寂寞#
  2. 周围添加#标签匹配的部分支架以后创建一个捕获组,用于反向参照\g<1>\1

\g<n>\n是我们在正则表达式世界中所称的“反向引用”。您可以拥有多个捕获组和多个反向引用 - \1\2\n。据this定义:

反向引用先前由捕获组

您可以使用反向引用每次需要重用其捕获组匹配的内容相匹配的时间匹配相同的文本。在你的情况下,你想保存实际的哈希标签以备后用,所以你可以使用反向引用\n来代替额外的临时变量。

看看一个简单的例子。比方说,你想一个正则表达式与<b>取代HTML <strong>标签和你想出以下的正则表达式:

> 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' 

反向引用是超级有用。您可以阅读更多关于它们的文章here,并检查Python的documentation如何以更高级的方式使用它。

+0

谢谢你,有没有什么机会可以解释\ g <1>和\ 1实际上对未来的参考作用,所以我明白我是如何使用它的。 – Phalaxion

+0

嘿@Phalaxion,在反向引用上编辑了更多答案;)。另外,替换字符串上的'\ g <1>'替换为'\ 1',只是为了使它更简单一些。 –