检查两个Python正则表达式模式是否等价

11

我想以re.VERBOSE模式编写正则表达式,但我不确定是否能够正确添加详细内容。

我记得理论上,可以通过生成它们的自动机并尝试查找图形双射来找到两个正则表达式(至少没有反向引用)的等价性。但是我看不到比较正则表达式的实例方法。

是否有一种方法可以生成正则表达式的自动机或直接进行比较,最好使用标准库?

(我已经决定采用不同的解决方案解决我的问题,但这仍然很有趣。)

1个回答

9
您可以使用未记录的re.DEBUG功能:
>>> r1 = re.compile("foo[bar]baz", re.DEBUG)
literal 102
literal 111
literal 111
in
  literal 98
  literal 97
  literal 114
literal 98
literal 97
literal 122
>>> r2 = re.compile("""foo   # foo!
...                    [bar] # b or a or r!
...                    baz   # baz!""", re.VERBOSE|re.DEBUG)
literal 102
literal 111
literal 111
in
  literal 98
  literal 97
  literal 114
literal 98
literal 97
literal 122

如果输出结果相同,那么r1r2也是相同的。

比文档记录更少的是未记录的。同时,在尝试编写检查正则表达式相等性的函数时,我发现由于re.compile缓存其结果,re.DEBUG可能不会输出。而且这并不是正则表达式的理论等价,因此这仅适用于re.VERBOSE更改。这是我的实现,附有示例:http://pastebin.com/DeCWLmF8(请随意从此评论中添加到您的答案中。) - leewz
我很失望re不能保存调试输出,也无法通过re.DEBUG强制重新编译。 - leewz
1
提出了一个关于re.DEBUG未强制重新编译的问题:http://bugs.python.org/issue20426 - leewz
@leewangzhong:考虑提出一个bug,为此添加一个方法,例如re.compile(ur'yada').equivalent(re.compile(ur'yada')) :) - Mr_and_Mrs_D
你是指一个功能请求吗? - leewz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接