代码之家  ›  专栏  ›  技术社区  ›  adw

正则表达式的最大匹配长度

  •  4
  • adw  · 技术社区  · 14 年前

    确定正则表达式最大匹配长度的最简单方法是什么?

    具体来说,我使用的是Python的 re

    E、 g.用于 foo((bar){2,3}|potato) 是12点。

    显然,正则表达式使用了 * + 具有理论上无限的匹配长度;在这些情况下返回错误或其他内容是可以的。使用 (?...) 分机也可以。

    2 回复  |  直到 14 年前
        1
  •  5
  •   unutbu    14 年前

    使用 pyparsing invRegex

    import invRegex
    data='foo(bar{2,3}|potato)'    
    print(list(invRegex.invert(data)))
    # ['foobarr', 'foobarrr', 'foopotato']    
    print(max(map(len,invRegex.invert(data))))
    # 9
    

    另一种选择是使用 ipermute this module .

    import inverse_regex
    data='foo(bar{2,3}|potato)'
    print(list(inverse_regex.ipermute(data)))
    # ['foobarr', 'foobarrr', 'foopotato']
    print(max(map(len,inverse_regex.ipermute(data))))
    # 9
    
        2
  •  3
  •   adw    14 年前

    我想解决了。感谢联合国大学给我指 sre_parse

    import sre_parse
    
    def get_regex_max_match_len(regex):
        minlen, maxlen = sre_parse.parse(regex).getwidth()
        if maxlen >= sre_parse.MAXREPEAT: raise ValueError('unbounded regex')
        return maxlen
    

    结果:

    >>> get_regex_max_match_len('foo((bar){2,3}|potato)')
    12
    >>> get_regex_max_match_len('.*')
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "<stdin>", line 3, in get_regex_max_match_len
    ValueError: unbounded regex