2017-04-13 60 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',只是爲了使它更簡單一些。 –