データベースに保存されている用語集に含まれている、大文字と小文字を区別しない特定のコンテンツブロック内のすべての単語を検索するために使用している正規表現があります。これが私のパターンです:
/($word)/i
問題は、私が使用する場合/(Foo)/i
、のような単語Food
が一致することです。単語の両側に空白または単語の境界が必要です。
Foo
文の最初、途中、または最後の単語である単語のみに一致するように式を変更するにはどうすればよいですか?
回答:
単語の境界を使用する:
/\b($word)\b/i
または、SinanÜnürの例のように「SPECTRE」を検索している場合:
/(?:\W|^)(\Q$word\E)(?:\W|$)/i
\b(<|>=)\b
一致していません>=
\b[-|+][0-9]+\b
一致+10
し43E+10
ます。どちらも欲しくない。
(\w+)
PCREまたは同様のものを使用していると仮定します。
このライブの例から取られた上のスクリーンショット:http://regex101.com/r/cU5lC2
(\w+)
私が使用していますphpsh対話型シェル上のUbuntu 12.10を実証するPCREの正規表現エンジンをとして知られている、方法をするpreg_match
phpshを起動し、いくつかのコンテンツを変数に入れて、単語に一致させます。
el@apollo:~/foo$ phpsh
php> $content1 = 'badger'
php> $content2 = '1234'
php> $content3 = '$%^&'
php> echo preg_match('(\w+)', $content1);
1
php> echo preg_match('(\w+)', $content2);
1
php> echo preg_match('(\w+)', $content3);
0
preg_matchメソッドは、PHP言語内のPCREエンジンを使用して、変数:$content1
、$content2
およびパターンを分析$content3
しました(\w)+
。
$ content1と$ content2には少なくとも1つの単語が含まれていますが、$ content3には含まれていません。
(dart|fart)
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(dart|fart)', $gun1);
1
php> echo preg_match('(dart|fart)', $gun2);
1
php> echo preg_match('(dart|fart)', $gun3);
1
php> echo preg_match('(dart|fart)', $gun4);
0
変数gun1とgun2には、文字列dartまたはfartが含まれています。gun4はしません。ただし、単語のfart
検索が一致する場合は問題になる可能性がありますfarty
。これを修正するには、正規表現で単語の境界を適用します。
el@apollo:~/foo$ phpsh
php> $gun1 = 'dart gun';
php> $gun2 = 'fart gun';
php> $gun3 = 'farty gun';
php> $gun4 = 'unicorn gun';
php> echo preg_match('(\bdart\b|\bfart\b)', $gun1);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun2);
1
php> echo preg_match('(\bdart\b|\bfart\b)', $gun3);
0
php> echo preg_match('(\bdart\b|\bfart\b)', $gun4);
0
したがってfart
、\b
単語の境界を持つ単語がコンテンツに存在しないことを除いて、前の例と同じですfarty
。
使用\b
すると、驚くべき結果が得られます。単語をその定義から分離するものを理解し、その情報をパターンに組み込む方がよいでしょう。
#!/usr/bin/perl
use strict; use warnings;
use re 'debug';
my $str = 'S.P.E.C.T.R.E. (Special Executive for Counter-intelligence,
Terrorism, Revenge and Extortion) is a fictional global terrorist
organisation';
my $word = 'S.P.E.C.T.R.E.';
if ( $str =~ /\b(\Q$word\E)\b/ ) {
print $1, "\n";
}
出力:
RExのコンパイル "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b" 最終プログラム: 1:バウンド(2) 2:OPEN1(4) 4:正確(9) 9:CLOSE1(11) 11:バウンド(12) 12:終了(0) 0に固定された「SPECTRE」(固定されていることを確認)stclass BOUND minlen 14 REx "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"のsvでの "SPに対する一致の開始を推測します .ECTRE(防諜のための特別幹部」... オフセット0でアンカーされたsubstr "SPECTRE"が見つかりました。 start_shift:0 check_at:0 s:0 endpos:1 STCLASSと矛盾しません... 推測:オフセット0で一致 REx "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"を "SPECTRE(Special Exec 防諜に役立つ」... 0 | 1:バウンド(2) 0 | 2:OPEN1(4) 0 | 4:正確(9) 14 | 9:CLOSE1(11) 14 | 11:BOUND(12) 失敗しました... 一致しませんでした レックスの解放: "\ b(S \ .P \ .E \ .C \ .T \ .R \ .E \。)\ b"
コード内の列挙型を検証したい人のために、ガイドに従うことができます
正規表現の世界では^
、文字列の開始と$
終了に使用できます。それらを組み合わせて使用する|
ことはあなたが望むものかもしれません:
^(Male)$|^(Female)$
Male
またはのFemale
場合にのみtrueを返します。
^
行$
の先頭(それぞれ末尾)に一致するため、例は、それらが行の唯一の単語である場合にのみ一致します。
Notepad ++で実行している場合
[\w]+
単語全体が表示され、括弧を追加してグループとして取得できます。例:conv1 = Conv2D(64, (3, 3), activation=LeakyReLU(alpha=a), padding='valid', kernel_initializer='he_normal')(inputs)
。LeakyReLU
コメントとして独自の行に移動し、現在のアクティベーションを置き換えたいと思います。notepad ++では、これは次のfindコマンドを使用して実行できます。
([\w]+)( = .+)(LeakyReLU.alpha=a.)(.+)
そして、replaceコマンドは次のようになります。
\1\2'relu'\4 \n # \1 = LeakyReLU\(alpha=a\)\(\1\)
スペースは、コード内で正しいフォーマットを維持するためのものです。:)