用于匹配BB代码的Python正则表达式
我正在写一个非常简单的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 个回答
7
你不应该用正则表达式来解析那些不是规则语言的东西(比如匹配标签)。可以考虑使用解析器来处理这些情况。
补充一下 - 快速搜索一下,能找到一些相关的信息,比如我找到的这个链接。
5
只需要把你的正则表达式从:
r'\[b\](.*)\[\/b\]'
改成
r'\[b\](.*?)\[\/b\]'
这里的 *
是个贪婪的匹配符,后面加个 ?
就可以让它变成不贪婪的匹配符。
下面是来自 Python re
文档的更详细解释:
‘*’、‘+’ 和 ‘?’ 这些匹配符都是贪婪的;它们会尽可能多地匹配文本。有时候这种行为并不符合我们的需求;比如,如果用正则表达式 <.*> 去匹配 '<H1>title</H1>',它会匹配整个字符串,而不仅仅是 '<H1>'。在匹配符后面加上 '?' 可以让它以不贪婪的方式进行匹配;也就是说,它会尽量少匹配字符。使用 .*? 在之前的表达式中只会匹配到 '<H1>'。