我想在Python中比较两个正则表达式。
基本上,我需要测试一个表达式是否包含在另一个表达式中。
例如,[AB] D包含在[AB] [CD]中。或者...... K ..包括在...... [KR] ..
我尝试了类似下面的内容,但它不起作用:
re.finditer(r"[AB][DF]",r"[AB]D")
re.finditer(r"[AB]D",r"[AB][CD]")
我的表达式可以有不同的大小,但是具有相同大小表达式的解决方案会很棒。
修改
我所有的正则表达都很简单。
他们只包含"积分","方括号"和" ^"。
。意味着"任何东西" (如* in real regexps)
[AB]表示" A或B"
[^ P]表示"不是P"
编辑2
感谢您的回答和评论,我想我将从一个正则表达式生成所有字符串的集合,并使用第二个正则表达式测试它们。
答案 0 :(得分:5)
你可以做到,但你必须自己做。这是很多工作,你可能会认为它不值得付出努力。这是你可以做到的一种方式:
将正则表达式A和B转换为NFA。
让(a,b)成为NFA格式的两个正则表达式的初始状态集。
取两个集的epsilon闭包,(e(a),e(b))。
对于每个符号,请遵循 e(a)和 e(b)沿符号的所有转换,以形成新的状态, (a',b')。
回到第三步。
最终,您将针对两个正则表达式递归所有可能的状态集。如果在任何时候 e(b)包含最终状态但 e(a)没有,则A不包含在内。
由于存在有限数量的状态集,因此可以保证终止。此技术不适用于反向引用。 技术上如果使用反向引用,则它们不再是正则表达式,至少从形式语言的角度来看。