1

だから、私は正規表現パターンのリストと文字列のリストを持っています。私がやりたいのは、この文字列のリストの中で、正規表現のいずれにも一致しない文字列があるかどうかです。

現在、正規表現と、2 つの辞書から正規表現によって照合される値を引き出しています。

2 つの辞書から、1 つはパターン、もう 1 つはキーの 2 つのリストを作成しました。

patterns = []
keys = []
for pattern, schema in patternproperties.items():
    patterns.append(pattern)
for key, value in value_obj.items():
    keys.append(key)

# Now work out if there are any non-matching keys

for key in keys:
    matches = 0
    for pattern in patterns:
        if re.match(pattern, key):
            matches += 1
    if matches == 0:
        print 'Key %s matches no patterns' %(key)

しかし、これは恐ろしく非効率的です。これに対するより良い解決策への指針は誰にもありますか?

4

3 に答える 3

3

正規表現は、小さなブロックのシーケンスではなく、テキストの大きなブロックを検索するために最適化されています。'\n'.join(keys)そのため、それぞれを個別に検索するのではなく、検索を検討することをお勧めします。

または、ループを Python から regexp に移動する代わりに、暗黙の「or」/「any」ビットを Python から regexp に移動します。

pattern = re.compile('|'.join('({})'.format(p) for p in patterns))    
for key in keys:
    if not pattern.match(key):
        print 'Key %s matches no patterns' %(key)

また、私が使用したことに注意してくださいre.compile。自動正規表現キャッシングのため、これは役に立たないかもしれません…しかし、それは決して害を及ぼすことはなく、コードを読みやすくすることもよくあります.


timeitキーの短いリストとさまざまな数の単純なパターンを使用した簡単なテストから:

patterns   original   alternation
2          76.1 us    42.4 us
3          109 us     42.5 us
4          143 us     43.3 us

そのため、パターンの数が線形からほぼ一定になりました。

もちろん、これはもっと複雑なパターンやパターンの数が多すぎるものには耐えられません。

于 2013-07-12T18:41:01.377 に答える
2
[key for key in keys if not any(re.match(pattern, key) for pattern in patterns)]
于 2013-07-12T18:32:33.800 に答える