5. Python正则表达式分析利器

tags: Python 正则表达式

Note

在学习正则表达式及Python re模块中,发现一个分析正则模式的利器,下面根据自己在阅读代码时见到的最复杂的正则表达式,来进行分析。

import re
# 该正则表达式来源于bottle框架的URL正则匹配模式,非常复杂!
re.compile('(\\\\*)'\
        '(?:(?::([a-zA-Z_][a-zA-Z_0-9]*)?()(?:#(.*?)#)?)'\
          '|(?:<([a-zA-Z_][a-zA-Z_0-9]*)?(?::([a-zA-Z_]*)'\
            '(?::((?:\\\\.|[^\\\\>]+)+)?)?)?>))', re.DEBUG)


# 以下为在命令行交互模式下的输出!逐行进行分析。
subpattern 1  # 捕获分组,编号为1.
  max_repeat 0 4294967295   # 贪婪匹配
    literal 92              # 匹配反斜杠
subpattern None             # 非捕获分组
  branch                    # 选择结构
    subpattern None         # 非捕获分组
      literal 58            # 匹配:
      max_repeat 0 1        # 可选的?
        subpattern 2        # 捕获分组,编号为2.
          in                # 字符类 []
            range (97, 122)   # a-z
            range (65, 90)     # A-Z
            literal 95         # 匹配_
          max_repeat 0 4294967295    # 贪婪匹配
            in                       # 字符类
              range (97, 122)        # 后面的依次进行分析即可。
              range (65, 90)
              literal 95
              range (48, 57)
      subpattern 3
      max_repeat 0 1
        subpattern None
          literal 35
          subpattern 4
            min_repeat 0 4294967295
              any None
          literal 35
  or
    subpattern None
      literal 60
      max_repeat 0 1
        subpattern 5
          in
            range (97, 122)
            range (65, 90)
            literal 95
          max_repeat 0 4294967295
            in
              range (97, 122)
              range (65, 90)
              literal 95
              range (48, 57)
      max_repeat 0 1
        subpattern None
          literal 58
          subpattern 6
            max_repeat 0 4294967295
              in
                range (97, 122)
                range (65, 90)
                literal 95
          max_repeat 0 1
            subpattern None
              literal 58
              max_repeat 0 1
                subpattern 7
                  max_repeat 1 4294967295
                    subpattern None
                      branch
                        literal 92
                        any None
                      or
                        max_repeat 1 4294967295
                          in
                            negate None      # 匹配除去字符类中的其他字符,^
                            literal 92
                            literal 62
      literal 62
<_sre.SRE_Pattern object at 0x1381f70>