2012-12-19 14 views
8

パターン(?<!(asp|php|jsp))\?.*はPCREで動作しますが、Pythonでは動作しません。Python正規表現ネガティブルックアヘッド

だから、この正規表現をPythonで動かすにはどうすればよいですか? (Python 2.7)

+6

どのように動作しませんか?エラーですか?その場合は、エラーを転記してください。期待通りのものではありませんか?もしそうなら、それを使用する場所にコードを掲示し、あなたが期待しているものとあなたが得た結果を見せてください。 – BrenBarn

+0

reモジュールの[doc](http://docs.python.org/2/library/re.html)ですが、否定的なlookbehindアサーションのサポートを明示しています。 –

+3

すべての選択肢の長さが同じである限り、ネガティブなルックアヘッドは機能します。これは '?(!<!asp | php | html)'ではなく、(?<!asp | php | jsp) 'を実行します。 – georg

答えて

9

それは私にとって完璧に機能します。多分それを間違って使っていますか? re.matchの代わりにre.searchを使用してください:

>>> import re 
>>> s = 'somestring.asp?1=123' 
>>> re.search(r"(?<!(asp|php|jsp))\?.*", s) 
>>> s = 'somestring.xml?1=123' 
>>> re.search(r"(?<!(asp|php|jsp))\?.*", s) 
<_sre.SRE_Match object at 0x0000000002DCB098> 

あなたのパターンがどのように振る舞うべきかを正確です。 glglglに記載されているように、Matchオブジェクトを変数(たとえばm)に割り当ててからm.group()を呼び出すと、一致を得ることができます。これにより、?1=123が得られます。

ところで、内かっこは除外できます。このパターンは等価です:

(?<!asp|php|jsp)\?.* 
+1

... 're.search(r"(?<!(asp | php | jsp))\? 。* "、s).group()は' '?1 = 123''を返します。 – glglgl