2016-12-07 15 views
2

非常に単純な正規表現のリストが文字列として表現されているとします(「非常に単純」という意味で、.*のみを意味します)。リスト内のすべての文字列が始まり、末尾は.*です。例えば、私は私がやりたい冗長正規表現を削除しますか?

rs = [.*a.*, .*ab.*, .*ba.*cd.*, ...] 

何を持っている可能性があり、別のサブセットであるこれらのパターンを追跡することです。この例では.*a.*はすべて.*ab.*と一致します。したがって、私は後者のパターンが冗長であると考えます。 1 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.*が実際に冗長であると結論を与えますリスト。

これは意味がありますか、それは私がやろうとしていることをしていますか?もちろん、このアプローチはいくつかの理由で複雑になるため、私の次の質問は誰も以前に遭遇したこれを行う良い方法があるということですか?

+0

ルックを与えます。状態マシンと正式な文法の理解が必要です。正規表現はhttp://math.stackexchange.com/questions/283838/is-one-regular-language-subset-of-anotherに依存しています。 –

+0

@PatrickHaughあなたの返信ありがとう。私はこの記事と、[this](https://github.com/ferno/greenery)パッケージを参照しているSOの関連記事を見てきましたが、計算上、使用することは禁止されています。私は、シンプルであり、少なくともいくつかのケースではうまくいく素朴なアプローチがあることを期待していました。 – user4601931

答えて

1

の議論のリンクです。しかし、startswithの代わりにcontainsをチェックする必要があります。

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))])  

はあなたにこの中

['.*a.*', '.*cd.*'] 
関連する問題