协慌网

登录 贡献 社区

Python 的隐藏功能

答案

链接比较运算符:

>>> x = 5
>>> 1 < x < 10
True
>>> 10 < x < 20 
False
>>> x < 10 < x*10 < 100
True
>>> 10 > x <= 9
True
>>> 5 == x > 4
True

如果你认为它正在做1 < x ,它出现为True ,然后比较True < 10 ,这也是True ,那么不,那真的不是发生了什么(参见最后一个例子。)它真的转化为1 < x and x < 10x < 10 and 10 < x * 10 and x*10 < 100 ,但键入较少,每个术语仅评估一次。

获取 python 正则表达式解析树来调试你的正则表达式。

正则表达式是 python 的一个很好的特性,但调试它们可能会很麻烦,并且很容易让正则表达式出错。

幸运的是,python 可以通过将未记录的,实验性的隐藏标志re.DEBUG (实际上是 128)传递给re.compile来打印正则表达式解析树。

>>> re.compile("^\[font(?:=(?P<size>[-+][0-9]{1,2}))?\](.*?)[/font]",
    re.DEBUG)
at at_beginning
literal 91
literal 102
literal 111
literal 110
literal 116
max_repeat 0 1
  subpattern None
    literal 61
    subpattern 1
      in
        literal 45
        literal 43
      max_repeat 1 2
        in
          range (48, 57)
literal 93
subpattern 2
  min_repeat 0 65535
    any None
in
  literal 47
  literal 102
  literal 111
  literal 110
  literal 116

一旦理解了语法,就可以发现错误。在那里,我们可以看到,我忘了逃脱[][/font]

当然,你可以将它与你想要的任何标志结合起来,比如评论的正则表达式:

>>> re.compile("""
 ^              # start of a line
 \[font         # the font tag
 (?:=(?P<size>  # optional [font=+size]
 [-+][0-9]{1,2} # size specification
 ))?
 \]             # end of tag
 (.*?)          # text between the tags
 \[/font\]      # end of the tag
 """, re.DEBUG|re.VERBOSE|re.DOTALL)

枚举

用枚举包装一个 iterable,它将产生项目及其索引。

例如:

>>> a = ['a', 'b', 'c', 'd', 'e']
>>> for index, item in enumerate(a): print index, item
...
0 a
1 b
2 c
3 d
4 e
>>>

参考文献: