2010-01-31 28 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