2016-07-01 8 views
2

に問題を持っていない:機能を証明することは全く正しい入力検証

私はこの人工的な例の機能を持っている:単語のリストを受け取り、動的に適切にすることなく、正規表現パターンを構築

def test_function(target, words): 
    pattern = re.compile(r"|".join(words)) 

    return bool(pattern.search(target)) 

リスト内の単語をにエスケープします。

使用サンプル:

text = "hello world!" 

print(test_function(text, ["test"])) # prints False 
print(test_function(text, ["hello"])) # prints True 
print(test_function(text, ["test", "world"])) # prints True 

質問:

どのように私はに、この機能をテストすることができますには、適切な正規表現エスケープや入力のサニタイズがないことを証明しますか?

つまり、wordsリストのどの項目をこの機能を「中断する」ために提供すればよいですか?


私は壊滅的なバックトラックをシミュレートし、(x+x+)+yまたは(a+)+のようにハングアップする機能を強制的にいくつかの「悪」の正規表現を試してみたが、機能はちょうど即座Falseを返し、問題の兆候はありません。

+1

常に* "true" を返します空の文字列(何でも言い換えれ)*。 –

答えて

2

これを行う方法はたくさんあります。例えば、有効な正規表現ではありません単語:

>>> test_function('a', ['*']) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "<string>", line 2, in test_function 
    File "/usr/lib64/python2.6/re.py", line 190, in compile 
    return _compile(pattern, flags) 
    File "/usr/lib64/python2.6/re.py", line 245, in _compile 
    raise error, v # invalid expression 
sre_constants.error: nothing to repeat 

や正規表現など、すべてに一致する単語:として何それが必要一致しない

>>> test_function('a', ['.*']) 
True 

またはワード正規表現:

>>> test_function('$^', ['$^']) 
False 

またはバックスラッシュで終了し、|をエスケープ単語:

>>> test_function('a', ['\\', 'a']) 
False 

致命的なバックトラックは、あまりにも動作します:

>>> test_function('a'*100, ['(a+)+b']) 
# Hangs. 
+0

ああ、「何も繰り返さない」というのは良いことだ。ありがとう!壊滅的なバックトラックをシミュレートして、関数が非常にゆっくりと動作するのを確認できますか? – alecxe

+1

@alecxe:そうだね。私は壊滅的なバックトラッキングの例を追加しました。 – user2357112

+0

素晴らしい、素晴らしい例、助けてくれてありがとう。 – alecxe

関連する問題