この質問はDjango URLリゾルバに由来しますが、問題は一般的な問題のようです。なぜ私のPythonの正規表現が複数のグループをチェックしているのですか?
私はこのように構築されたURLを一致させたい:
1,2,3,4,5,6/10,11,12/
私が使用している正規表現は次のとおりです。
^(?P<apples>([]+,?)+)/(?P<oranges>([]+,?)+)/$
私が「有効」URL(すなわちに対してそれと一致するようにしようとすると
In [11]: print datetime.datetime.now(); re.compile(r"^(?P<apples>([]+,?)+)/(?P<oranges>([]+,?)+)/$").search("114,414,415,416,417,418,419,420,113,410,411,412,413/1/"); print datetime.datetime.now()
2011-10-18 14:27:42.087883
Out[11]: <_sre.SRE_Match object at 0x2ab0960>
2011-10-18 14:27:42.088145
ただし、「無効な」URL(一致しないもの)と一致させようとすると、 、全体の正規表現は何も返さないために、時間の大きさを取る:
In [12]: print datetime.datetime.now(); re.compile(r"^(?P<apples>([]+,?)+)/(?P<oranges>([]+,?)+)/").search("114,414,415,416,417,418,419,420,113,410,411,412,413/"); print datetime.datetime.now()
2011-10-18 14:29:21.011342
2011-10-18 14:30:00.573270
私はいくつかのグループが一致する必要がある場合に非常に遅くなる正規表現エンジンで何かがあると仮定します。このための回避策はありますか?たぶん私の正規表現を修正する必要がありますか?
REエンジンは言語の種類に少し少なく柔軟になりがち一致するが、彼ら受け入れてください。スタックベースのREエンジンは "いい" REを持っていればいいですが、オートマトンベースのREエンジンは "より厄介な" REを扱いますが、はるかに不思議な方法です。 (オートマトン理論のREエンジンに機能を追加するのは非常に難しい。なぜなら、すべてが相互作用する可能性があるすべての可能な方法に常に対処しなければならないからです。) –
@DonalFellows:なぜREエンジンは、シンプルなREのためのオートマトンと、機能搭載のバックトラックエンジンを使用すべきですか?それはどちらの/または命題でもないので、私はそのような単純な正規表現のための節で声明を修飾するように注意していたのです。 –
ありがとう、トリックでした! –