「何も一致しない」の正規表現構文?


82

正規表現を多用するPythonテンプレートエンジンがあります。次のような連結を使用します。

re.compile( regexp1 + "|" + regexp2 + "*|" + regexp3 + "+" )

個々の部分文字列(regexp1、regexp2など)を変更できます。

何にも一致しない小さくて軽い表現はありますか?一致したくないテンプレート内で使用できますか?残念ながら、「+」または「*」が正規表現アトムに追加されることがあるため、空の文字列を使用できません。これにより、「何も繰り返さない」エラーが発生します。



3
タイトルは「何にも一致しない正規表現」と言い換えることができますか?何も一致しないということは、空の文字列が正常に一致することを意味します。
BamaPookie

回答:


122

これは何にも一致しないはずです:

re.compile('$^')

したがって、regexp1、regexp2、およびregexp3を '$ ^'に置き換えると、一致するものを見つけることができなくなります。マルチラインモードを使用している場合を除きます。


いくつかのテストの後、私はより良い解決策を見つけました

re.compile('a^')

一致させることは不可能であり、前の解決策よりも早く失敗します。を他の文字に置き換えることができ、一致させることは常に不可能です


それは確かに何にも一致せず、正規表現エンジンが処理するのに軽量ですか?(私のスタブ正規表現にCPUをたくさん食べさせたくない)
grigoryvp 2009年

@地獄の目。軽量である必要があります。これは、行の終わりとそれに続く行の開始を一致させようとします。これは一行では不可能です。
Nadia Alramli 2009年

1
しかし、もちろん複数の行で可能です(フラグが有効かどうかによって異なります)-フラグが有効かどうかに関係なく機能するソリューションについては、私の答えを参照してください。
Peter Boughton

16
正規表現 "$ ^"は、少なくとも一部の実装では、空の文字列と一致します。2番目の方が優れています。
ローマンスターコフ2010年

@romkyns 2つ目は、PyQt4の呼び出しで空の文字列と一致しませんQtCore.QRegExp。実行するのが確かに軽くなったので、とても悪いです。
ジョエル2014年

43

(?!)常に一致しないはずです。これは、ゼロ幅の負の先読みです。括弧内の内容が一致する場合、一致全体が失敗します。何も入っていないので、何でも(何も含まない)マッチに失敗します。


4
そうです、私もこれを投稿するつもりでした。あなたの言語が先読みをサポートしている場合、これが最良の方法です。同様に(?=)はすべての文字列に一致します。
ブライアンカーパー

16

空の文字列を照合するには(複数行モードでも)、を使用できます\A\Z

re.compile('\A\Z|\A\Z*|\A\Z+')

違いは、\A\Z文字列の開始と終了であるのに対し^$これらは行の開始/終了と一致する可能性があるためです。$^|$^*|$^+一致する可能性がある改行を含む文字列と一致する可能性があります(フラグが有効になっている場合)。

また、(空の文字列であっても)何にも一致しない場合は、文字列の開始前にコンテンツを検索してみてください。例:

re.compile('.\A|.\A*|.\A+')

(定義上)\ Aの前に文字を含めることはできないため、これは常に一致しません。


行末を使用するよりも早く終了すると思うので、あなたは私のものよりも見栄えがします。
ShuggyCoUk 2009年

ピーター、あなたは\ z(小文字)を使用しますが、私のPythonポケットガイドは文字列の終わりのアサーションが\ Z(大文字)であると教えてくれますか?!
ThomasH 2010

ThomasH、どちらも文字列の終わりですが、大文字のバージョンでは末尾の改行が許可されますが、小文字のバージョンでは許可されません。
Peter Boughton 2010

ああ、面白い、これはどこにも文書化されていない。また、re.search( "boo \ z"、 "fooboo")は一致オブジェクトを返しませんが、re.search ( "boo \ Z"、 "fooboo)返します。むしろre.search (" boo \ z "、" foobooz ")が一致します。これは、 '\ z'が単に 'z'として解釈されるという事実を表していますよね?!(これはPython 2.6にあります)
ThomasH 2010

申し訳ありませんが、PythonはPCREだと思っていましたが、いくつかの違いがあり、これもその1つです。(regular-expressions.info/refflavors.htmlの「Anchors」を参照
Peter Boughton


1

あなたは使用することができます
\z..
。これは何の2に続いて、文字列の絶対終わりです

場合 +または*が最後にタックされた、これはまだ何にも一致することを拒否して機能します


なぜ2つあるのですか?IIRC\zは、とは異なり\Z、末尾の改行を許可しません。したがって、1つで十分ではありませんか?または、これに対する奇妙な防御*(なぜそれを防御しているのですか?)
mpen19年

0

または、リスト内包表記を使用して不要な正規表現エントリを削除し、結合してすべてをまとめます。何かのようなもの:

re.compile('|'.join([x for x in [regexp1, regexp2, ...] if x != None]))

ただし、コードのその行の横にコメントを追加してください:-)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.