删除冗余正则表达式?

时间:2016-12-07 16:49:06

标签: python regex

假设我有一个非常简单的正则表达式列表,表示为字符串(通过"非常简单",我的意思是只包含.*)。列表中的每个字符串都以.*开头和结尾。例如,我可以

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.*确实是多余的。

这是否有意义,是否做了我想做的事情?当然,由于多种原因,这种方法变得复杂,所以我的下一个问题是,有没有更好的方法来做任何人以前遇到的事情?

2 个答案:

答案 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
}