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

2 投票
2 回答
1946 浏览
提问于 2025-04-15 18:42

我正在写一个非常简单的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>'。

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

撰写回答