web-dev-qa-db-ja.com

正規表現と「逆マッチ」する方法は?

私はRegexBuddyを使用していますが、とにかくこの問題で困っています:\

ファイルを1行ずつ処理しています。必要なものに合わせて「ラインモデル」を作成しました。

今、私は逆マッチをしたい...つまり、6文字の文字列がある行を一致させたいが、これらの6文字がnotAndrea、どうすればいいですか?


編集:この正規表現を使用するプログラムを作成します。pythonまたはphpで、正規表現を学ぶためにこのことを最初に行うかどうかはまだわかりません。 )さまざまな行のタイプがあるため、正規表現を使用して、関心のあるタイプを選択します。これらの行を取得したら、既知の値と一致しないようにするためだけに他のフィルターを適用します。それ以外のすべてのフィルターが必要です。 (?!不要ではない)はかなりうまく機能しています。ありがとう。 :-)

これで質問が明確になることを願っています:)

93
Andrea Ambu
(?!Andrea).{6}

正規表現エンジンが負の先読みをサポートしていると仮定します。

編集:..または[A-Za-z]{6}の代わりに.{6}を使用することをお勧めします

編集(再度):先読みと後読みは通常、正規表現の一致を「反転」する正しい方法ではないことに注意してください。正規表現は、ネガティブマッチングを行うために実際に設定されているわけではありません。正規表現は、使用する言語に任せます。

62
Dan

Python/Javaの場合、

^(.(?!(some text)))*$

http://www.lisnichenko.com/articles/javapython-inverse-regex.html

46
Dmytro

Alan Mooreからのフィードバックで更新

PCREおよび類似のバリアントでは、値を含まない行に一致する正規表現を実際に作成できます。

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

これは tempered greedy token と呼ばれます。欠点は、うまく機能しないことです。

17
Zenexer

どの言語を使用していますか?これには、正規表現実装の機能と構文が重要です。

先読みを使用できます。 pythonを例として使用

import re

not_andrea = re.compile('(?!Andrea)\w{6}', re.IGNORECASE)

それを分解するには:

(?! Andrea)は、「次の6文字が「Andrea」でない場合に一致」を意味します。もしそうなら

\ wは「単語文字」-英数字を意味します。これは、クラス[a-zA-Z0-9_]と同等です

\ w {6}は、正確に6ワードの文字を意味します。

re.IGNORECASEは、「Andrea」、「andrea」、「ANDREA」を除外することを意味します...

もう1つの方法は、プログラムロジックを使用することです。Andreaと一致しないすべての行を使用し、2番目の正規表現を使用して6文字をチェックします。または、最初に少なくとも6つのWord文字を確認してから、Andreaと一致しないことを確認します。

10
Hamish Downer

負の先読みアサーション

(?!Andrea)

これは完全に逆の一致ではありませんが、正規表現を使用して直接実行できる最善の方法です。ただし、すべてのプラットフォームでサポートされているわけではありません。

5
Vinko Vrsalovic

RegexBuddyでこれを行いたい場合、正規表現に一致しないすべての行のリストを取得する2つの方法があります。

[テスト]パネルのツールバーで、テストスコープを[行ごと]に設定します。これを行うと、同じツールバーの「すべてをリスト」ボタンの下に「一致しないすべての行をリスト」という項目が表示されます。 (「すべてをリスト」ボタンが表示されない場合は、メインツールバーの「一致」ボタンをクリックします。)

GREPパネルでは、「行ベース」チェックボックスと「結果を反転」チェックボックスをオンにして、grepしているファイル内の一致しない行のリストを取得できます。

4
Jan Goyvaerts

(?!は実際に役立ちます。厳密に言えば、先を見ることは数学的に定義された正規表現ではありません。

反転正規表現は手動で作成できます。

プログラム は、結果を自動的に計算します。その結果、マシンが生成されます。これは通常、手書きのものよりもはるかに複雑です。しかし、結果は機能します。

4
weakish

私はこの方法を思いつきましたが、これはハードウェアを集中的に使用する可能性がありますが、機能しています:

正規表現に一致するすべての文字を空の文字列で置き換えることができます。

これはワンライナーです:

notMatched = re.sub(regex, "", string)

非常に複雑な正規表現の使用を余儀なくされ、そのすべての部分を反転する方法を理解できなかったため、これを使用しました。

これは文字列の結果のみを返し、一致オブジェクトは返しません!

0