2011-01-26 4 views
3

特定の文字シーケンスに一致しない文字列を検索したい。たとえば:クイックPython正規表現質問:ネゲートされた文字のセットを一致させる

REGEX = r'[^XY]*' 

のようなもの、私は隣同士にXとYを除く任意の数の文字を持つ文字列を探したいのですが...上記の正規表現があるため動作しません。 XとYを別々にブロックします。

+0

私はPythonの正規表現についてはあまりよく分かりませんが、あなたがしているものはうまくいくはずです。代わりに、 '*'を '+' –

+1

に置き換えてみてください。http://nmichaels.org/regular.pyで確認したところ、正常に動作しているようです。あなたは私たちにそれをテストする文字列を与えることができますか? – nmichaels

+0

また、XsとYsを別々にブロックすることについてはどういう意味か分かりません。この正規表現は* XsとYsを無視します。 –

答えて

2

方法について:

if "XY" not in s: 
    print "matched" 
else 
    print "not matched" 

それともこれはいくつかの長い正規表現に含めるためのですか?それを行うには、いくつかの方法があります

+0

私はあなたが最初の行に余分な 'not 'を持っていると思います。 –

1

固定タイプミス:

REGEXP="...(?!XY)..." 

EDIT:その後、多分あなたは否定先読み表現をしたいです。

^(?!.*XY).*$ 

lookahead式は、文字列内の任意の場所にあるXYシーケンスと一致するように試みます。 否定 lookaheadなので、見つかった場合は試合が失敗します。それ以外の場合は.*が先に進み、文字列全体が消費されます。

^(?:(?!XY).)*$ 

この1つは、繰り返し任意の文字(.)に一致しますが、先読みは文字がXYシーケンスの始まりではないことを確認した後にのみ。それはYが続いていない場合

^(?:[^X]+|X(?!Y))*$ 

は繰り返しX、またはX以外の任意の文字の一つ以上に一致します。

最初の2つの正規表現では、元の文字列の改行である可能性がある場合は、DOT_ALL修飾子を適用する必要があります。ドットの代わりに無効化された文字クラス - [^X] - が使用されているため、3番目の文字は不要です。

関連する問題