factor -> digit | ( expr )
以及代码:
复制代码 代码如下:
#!/usr/bin/python
# -*- coding: utf-8 -*-
#
#author: rex
#blog: http://jb51.net
#filename math.py
#created: 2010-08-07 00:44
integer=r"\d+"
factor=r"%s (?:\. %s)?" % (integer, integer)
term= "%s(?: \s* [*/] \s* %s)* " % (factor, factor)
expr= "(?x) %s(?: \s* [+-] \s* %s)* " % (term, term)
print expr
看一下它的输出和匹配效果图:
小贴士 •如果不用复杂的正则式就能解决问题,一定不要用。
•如果必须写比较复杂的正则式,请参考以下原则。
•从大处着眼,先理解待解析的文本的整体结构是什么样子,划分为小部件;
•从细处着手,试图实现每一个小部件,力求每一部分都是完整、坚固的,且放在全局也不会冲突。
•合理组装这些部件。
•分而治之的好处:只有某个模块出错,其它部分没错时,可以迅速定位错误,消除BUG。
•谨慎使用捕获括号,除非你知道自己在做什么,知道它会有什么副作用,以及是否有可行的解决措施。对于短小的正则式来说,一两个多余的括号是无伤大雅的;但是对于复杂的正则式来说,一对多余的括号可能就是致命的错误。
•尽量使用free-space模式。此时你可以自由地添加注释和空白字符,以便提高正则表达式的可读性。