用于匹配bb代码的Python正则表达式

时间:2010-01-31 14:36:16

标签: python regex

我正在写一个非常简单的bbcode解析。如果我想替换hello i'm a [b]bold[/b] text,我已成功替换此正则表达式

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

用这个

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

获取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

如何解决问题?感谢

2 个答案:

答案 0 :(得分:7)

您不应该使用正则表达式来解析非常规语言(如匹配标记)。相反,请查看解析器。

修改 - Google快速搜索会让我here

答案 1 :(得分:5)

只需更改您的正则表达式:

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

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

*限定符是贪婪的,为它添加?,使其作为非贪婪的限定符执行。

这是从python re文档中获得的更完整的解释:

  

'*','+'和'?'限定符是   都贪心他们匹配尽可能多的文字   可能。有时这种行为   是不希望的;如果RE&lt;。*&gt;是   匹配'&lt; H1&gt;标题&lt; / H1&gt;',它   将匹配整个字符串,而不是   只是'&lt; H1&gt;'。添加'?'之后   限定符使它执行匹配   以非贪婪或极简的方式;如   尽可能少的人物   匹配。使用。*?在以前   表达式只匹配'&lt; H1&gt;'。

     

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