2010-01-31 22 views
2

我在寫一個非常簡單的bbcode解析。如果我想更換hello i'm a [b]bold[/b] text,我有這個Python正則表達式匹配bb代碼

<strong>\g<1></strong>

替換這個表達式

r'\[b\](.*)\[\/b\]'

得到hello, i'm a <strong>bold</strong> text成功。

如果我有兩個或更多相同類型的標籤,它會失敗。例如:

i'm [b]bold[/b] and i'm [b]bold[/b] too

i'm <strong>bold[/b] and i'm [b]bold</strong> too

如何解決這個問題?謝謝

+0

我想你忘了關閉最後一個[B]標籤在你的榜樣。所以你的示例字符串應該是這樣的:「我是[b]粗體[/ b],我也是[b]粗體[/ b]」;) – 2010-01-31 14:41:58

+0

它必須非常簡單, b] [i]這個[/ i] [/ b]'用例會打敗它。 – 2010-01-31 17:33:32

+0

我糾正了缺少'[/ b]'標籤。 – 2010-01-31 21:46:02

回答

5

剛剛從改變你的正則表達式:

r'\[b\](.*)\[\/b\]' 

r'\[b\](.*?)\[\/b\]' 

*預選賽是貪婪的,附加一個?它,你讓它執行作爲一個非貪婪限定符。

下面是從Python re文件採取了更爲完整的解釋: '?'

的 '*', '+',和預選賽是 都貪婪;它們可以與 相匹配。有時這種行爲 是不希望的;如果RE <。* >是 對匹配 '<H1>標題</H1 >',它 將整個字符串匹配,而不是僅僅 '<H1>'。添加'?'在 限定符之後使其以非貪婪或最小方式執行匹配 ;作爲 儘可能少的字符將會是 匹配。使用。*?在前面的 表達式將僅匹配'<H1>'。

來源:http://docs.python.org/library/re.html

+0

哦,非貪婪的比賽..工作,謝謝:) – pistacchio 2010-01-31 14:45:23

7

你不應該使用正則表達式來解析非常規語言(比如匹配標籤)。改爲查看解析器。

編輯 - 快速Google搜索需要我here

+0

我是Python新手。 我知道這篇文章很久以前,但爲什麼它是一個解析器將被推薦超過正則表達式?兩者如何處理不同的事物? 謝謝 – Mike 2010-06-27 01:21:41

+0

@Mike Hayes:這不是Python特有的 - 它是語言理論。一個簡單的例子說明爲什麼你需要一個解析器來解析類似匹配標籤的東西是字符串'我嵌套我的加粗標籤'。如果您只匹配「」和「」對之間,則在此示例中出現錯誤的文字。要了解更多信息,您應該閱讀常規語言(您可以使用正則表達式)和上下文無關語言(您需要解析器)之間的區別。 – danben 2010-06-27 02:31:12