假设我有一个用字符串表示的非常简单的正则表达式列表(“非常简单”,我的意思是只包含 .*)。列表中的每个字符串都以 .* 开头和结尾。例如,我可以
rs = [.*a.*, .*ab.*, .*ba.*cd.*, ...]
我想做的是跟踪那些属于另一个模式的子集的模式。在此示例中,.*a.* 匹配 .*ab.* 所做的一切,甚至更多。因此,我认为后一种模式是多余的。
我想做的是拆分 .* 上的字符串,匹配相应的元素,并测试是否一个 startswith 另一个。更具体地说,考虑 .*a.* 和 .*ab.*。在 .*
a = ['', 'a', '']
b = ['', 'ab', '']
和zip一起ping他们给出
c = [('', ''), ('a', 'ab'), ('', '')]
然后,
all(elt[1].startswith(elt[0]) for elt in c)
返回 True 所以我得出结论,如果 .*a.* 包含在列表中,则 .*ab.* 确实是多余的.
这是否有意义,是否符合我的要求?当然,由于多种原因,这种方法会变得复杂,所以我的下一个问题是,是否有任何人以前遇到过的更好的方法来做到这一点?
请您参考如下方法:
对于这个问题,您需要找到两个正则表达式的最小 DFA 并进行比较。
这是对同一问题的讨论的链接- How to tell if one regular expression matches a subset of another regular expression?
