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


21

特定の正規表現を機能させようとしましたが、必要なことを実行できません。

基本的にはROCKETを探して欲しいです。正規表現は、大文字または小文字のROCKETと一致し、句読点の有無にかかわらず、別の単語の一部ではない必要があります。したがって、正規表現は次のいずれかでトリガーされます。

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

しかし、それが次のようなもので見つかった場合、ROCKETでトリガーしません

Rocketeer
Sprocket

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


1
これは、質問がスタックオーバーフローにより適している[まれな]状況の1つです。各言語には独自の特性があるため、言語またはプラットフォーム、あるいはその両方を必ず提供してください。たとえば、Windows。.NetとRegexクラス。(通常、その逆です。StackOverflowは、スーパーユーザーにより適した開発者から数百のトピック外の質問を受け取ります)。
jww 2015

回答:


14

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

英数字以外の文字で囲まれた「ロケット」という単語について、大文字と小文字を区別しない一致を実現したい場合。機能する正規表現は次のとおりです。

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

ゼロ以上の(*)英数字以外の(\ W)文字を探し、その後に大文字と小文字を区別しないバージョンのロケット((?i)rocket(?-i))を続け、その後再びゼロ以上( *)非英数字(\ W)。ロケットマッチング用語の周りの余分な括弧は、別のグループに一致を割り当てます。したがって、ロケットという単語はマッチグループ1に含まれます。

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

\W*(rocket)\W*

Regex101これは正規表現の入力の隣のテキストボックスに「I」を入力することによってシミュレートすることができます。

UPDATE 2 Ismaelは、正規表現は「1rocket1」と一致する可能性があるため、正確ではないことを述べました。彼ははるかに優れたソリューション、つまり

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


1
これを正規表現テスターオンライン(たとえばregex101.com)でテストすると、無効であり、入力した文字列の例と一致しないことがわかります。これは、Pythonスクリプトの一部として使用するためのものです。それはそれが書かれるべき方法に違いをもたらしますか?
ケフカ2015

1
はい、そうです。regex101.comで左上にある「フレーバー」を選択できることがわかります。Pythonは少し異なります。私の答えをpythonで更新します。
Xaser 2015

1
ありがとう。正規表現は基本的に言語に依存しないと思いました。
ケフカ2015

1
それらはそうあるべきですが、マイナーな実装の違いが存在します。
Xaser 2015

2
そして\W*(rocket)\W*マッチするlrocketl。それはする必要があります(?:^|\W)(rocket)(?:$|\W)(せずに*、あなたはそれを開始および/または文字列の末尾にマッチするかどうかを確認する必要があり)。
Ismael Miguel

10

この場合、先読みはやり過ぎです。ignorecaseオプションで単語の境界を使用したほうがよいでしょう。

\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']

技術的には、非キャプチャグループはルックアラウンドではありませんが、/ bオプションはIsmaelのソリューションとまったく同じ結果を生成しますが、少しエレガントな場合があります。
Xaser 2015

1

使用することができます。では、オプションは大文字小文字を区別しない(ようになります gnoreケース):grepsed\<rocket\>grep-i

grep -i '\<rocket\>'

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

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

0

[単語全体のみを検索]オプションを使用します。

句読点に関しては、フレーバー/フレーバーがわかるまでは答えられません。

これは非常に古いスレッドなので、後で必要になる可能性がある人のために投稿されています。スレッドを作成した人が別のスレッドに移動した可能性があります...いいえ?


何されてwhole words only option使用しgrepたりphp?申し訳ありませんが、あなたの答えは他の答えと比較して付加価値を与えません。
トト
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.