Regular Expressions
ルックアヘッドとルックバック
サーチ…
構文
- ポジティブな先読み:
(?=pattern)
- 否定先読み:(
(?!pattern)
- 正のlookbehind :
(?<=pattern)
- 負のlookbehind :
(?<!pattern)
備考
すべてのregexエンジンでサポートされていません。
さらに、多くの正規表現エンジンは、lookbehinds内のパターンを固定長文字列に制限します。たとえば、パターン(?<=a+)b
はaaab
のb
と一致する必要がありますが、Pythonではエラーが発生します。
キャプチャグループは、後方参照を含めて、許可され、期待どおりに動作します。先読み/見かけのヒント自体は、キャプチャグループではありません。
基本
肯定先読み (?=123)
は、一致にパターンを含めることなく、テキストに指定されたパターンが続くことを示します。同様に、 正のlookbehind (?<=123)
は、指定されたパターンの前にテキストがあると主張します。 =
を!
置き換えて!
アサーションを否定します。
入力 : 123456
-
123(?=456)
123
( 正の先読み )と一致し123(?=456)
-
(?<=123)456
一致456
( ポジティブなルックバック ) -
123(?!456)
が失敗( 否定先読み ) -
(?<!123)456
が失敗します( 負のlookbehind )
入力 : 456
-
123(?=456)
が失敗する -
(?<=123)456
が失敗する -
123(?!456)
が失敗する -
(?<!123)456
一致456
lookbehindを使用してエンディングをテストする
Lookbehindは、パターンの終わりに使用して、パターンが終了するかどうかを特定の方法で確認できます。
([az ]+|[AZ ]+)(?<! )
は、末尾の空白を排除して小文字または大文字のみのシーケンスにマッチします。
\ Kで可変長の見掛け目をシミュレートする
いくつかの正規表現フレーバー(Perl、PCRE、Oniguruma、Boost)は固定長ルックビヘイドのみをサポートしていますが、パターンの先頭で可変長ルックビハインドをシミュレートするために使用できる\K
機能を提供しています。 \K
に遭遇すると、この点までの一致するテキストは破棄され、 \K
続くパターンの部分に一致するテキストのみが最終結果に保持されます。
ab+\Kc
それと同等です:
(?<=ab+)c
一般に、次の形式のパターン:
(subpattern A)\K(subpattern B)
次のようになります。
(?<=subpattern A)(subpattern B)
BサブパターンがAサブパターンと同じテキストにマッチする場合を除いて、本当のルックバックとは異なり、Aサブパターンがテキストを消費するので、微妙に異なる結果に終わることがあります。