web-dev-qa-db-ja.com

特定の単語に一致するように正規表現を書くにはどうすればいいですか?

私は特定の正規表現を動かそうとしてきましたが、必要なことをすることができません。

基本的に、私はそれがROCKETを探すことを望みます。正規表現は、大文字小文字の区別なしで、句読点の有無にかかわらずROCKETと一致しますが、別のWordの一部ではありません。そのため、正規表現は次のいずれかでトリガーされます。

rocket
RoCKEt
hi Rocket
This is a rocket.
ROCKET's engine

しかし、ROCKETが次のようなものに見つかったときにはトリガーしません。

Rocketeer
Sprocket

私はオンラインで正規表現ジェネレータを使ってそれを正しくしようとしてきました、しかし私はそれを正確に一致させることができません。

13
Kefka

MSDN正規表現クイックリファレンス をブックマークすることをお勧めします。

英数字以外の文字で囲まれた「ロケット」という単語を大文字と小文字を区別しないで一致させる必要があります。有効な正規表現は次のようになります。

\W*((?i)rocket(?-i))\W*

それは、ゼロ個以上(*)の英数字以外の文字(\ W)、大文字と小文字を区別しないバージョンのロケット((?i)rocket(? - i))、それに続けてゼロ個以上( *)英数字以外の文字(\ W)ロケットマッチング用語を囲む余分な括弧は、そのマッチングを別のグループに割り当てます。 Wordロケットはマッチグループ1になります。

UPDATE 1:Mattはコメントでこの正規表現はpythonで使われるべきだと言った。 Pythonの構文は少し異なります。 pythonで同じ結果を得るには、この正規表現を使ってcompileまたはmatch関数にre.IGNORECASEオプションを渡します。

\W*(rocket)\W*

On Regex101 これは、正規表現入力の隣のテキストボックスに "i"を入力することでシミュレートできます。

UPDATE 2 Ismaelは、 "1rocket1"と一致する可能性があるため、正規表現は正しくないと述べました。彼はもっと良い解決策を投稿しました。

(?:^|\W)rocket(?:$|\W)

8
Xaser

私はこのケースでは見通しがやり過ぎると思います、そしてignorecaseオプションでWordの境界を使うほうがよいでしょう、

\brocket\b

言い換えれば、Pythonでは:

>>> x="rocket's"
>>> y="rocket1."
>>> c=re.compile(r"\brocket\b",re.I)  # with the ignorecase option
>>> c.findall(y)
[]
>>> c.findall(x)
['rocket']
9
beroe

grepsedでは、\<rocket\>を使用できます。 grepの場合、-iオプションは大文字と小文字を区別しません(i大文字と小文字を区別しない):

grep -i '\<rocket\>'

すべてのsed正規表現の大文字と小文字を区別しないようにする方法はわかりませんが、常に穴居人の方法があります。

sed -n '/\<[Rr][Oo][Cc][Kk][Ee][Tt]\>/p'
0
Scott