かっこ内のテキストを見つけることになっている、小さくて素朴な正規表現を書きました。
re.search(r'\((.|\s)*\)', name)
いくつかの理由でこれが最善の方法ではないことはわかっていますが、問題なく機能していました。私が探しているのは、一部の文字列でこの式が指数関数的に長くかかり始め、その後終了しない理由についての説明です。昨夜、このコードを数か月実行した後、サーバーの1つが突然、次のような文字列と一致してスタックしました。
x (y) z
私はそれを実験して、「y」と「z」の間のすべてのスペースで所要時間が2倍になることを確認しました。
In [62]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (22 * ' ') + 'z')
1 loops, best of 3: 1.23 s per loop
In [63]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (23 * ' ') + 'z')
1 loops, best of 3: 2.46 s per loop
In [64]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (24 * ' ') + 'z')
1 loops, best of 3: 4.91 s per loop
ただし、スペース以外の文字には同じ効果はありません。
In [65]: %timeit re.search(r'\((.|\s)*\)', 'x (y)' + (24 * 'a') + 'z')
100000 loops, best of 3: 5.23 us per loop
注:私は、この問題に対するより良い正規表現や別の解決策を探していません。私たちはもうそれを使用していません。