假设我有一个非常简单的正则表达式列表,表示为字符串(通过"非常简单",我的意思是只包含.*
)。列表中的每个字符串都以.*
开头和结尾。例如,我可以
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
,因此如果列表中包含.*ab.*
,我的结论是.*a.*
确实是多余的。
这是否有意义,是否做了我想做的事情?当然,由于多种原因,这种方法变得复杂,所以我的下一个问题是,有没有更好的方法来做任何人以前遇到的事情?
答案 0 :(得分:1)
对于这个问题,你需要为正则表达式找到最小的DFA并比较它们 以下是对相同问题的讨论的链接 - How to tell if one regular expression matches a subset of another regular expression?
答案 1 :(得分:1)
假设每个字母组合都被reglist = ['.*a.*', '.*ab.*', '.*ba.*', '.*cd.*']
patterns = set(x.split('.*')[1] for x in reglist)
remove = []
for x in patterns:
for y in patterns:
if x in y and x != y:
remove.append(y)
print (['.*{}.*'.format(x) for x in sorted(patterns - set(remove))])
包围并且没有在中间,那么这种方法几乎可以正常工作。但是,您需要检查包含,而不是startwith。
['.*a.*', '.*cd.*']
给你
{
"kind": "Status",
"apiVersion": "v1",
"metadata": {},
"status": "Failure",
"message": "endpoints \"kube-ui\" not found",
"reason": "NotFound",
"details": {
"name": "kube-ui",
"kind": "endpoints"
},
"code": 404
}