我正在写一个非常简单的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
如何解决问题?感谢
答案 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;'。