Как написать регулярное выражение для поиска определенного слова?

Как написать регулярное выражение для поиска определенного слова?

Я пытаюсь заставить работать определенное регулярное выражение, но не могу заставить его делать то, что мне нужно.

По сути, я хочу, чтобы он искал ROCKET. Регулярное выражение должно соответствовать ROCKET в верхнем или нижнем регистре, с пунктуацией или без нее, но не когда это часть другого слова. Таким образом, регулярное выражение сработает на любом из этих:

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

но НЕ срабатывает на РАКЕТУ, когда она находится в чем-то вроде

Rocketeer
Sprocket

Я пытался сделать это правильно, используя онлайн-генератор регулярных выражений, но у меня не получается добиться точного соответствия.

решение1

Предлагаю добавить в закладкиКраткий справочник по регулярным выражениям MSDN

вы хотите добиться нечувствительного к регистру совпадения для слова "ракета", окруженного не буквенно-цифровыми символами. Регулярное выражение, которое будет работать, будет следующим:

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

Он будет искать ноль или более (*) небуквенно-цифровых (\W) символов, за которыми следует нечувствительная к регистру версия rocket ( (?i)rocket(?-i) ), за которой снова следует ноль или более (*) небуквенно-цифровых символов (\W). Дополнительные скобки вокруг термина, совпадающего с rocket, назначают совпадение отдельной группе. Таким образом, слово rocket будет в группе совпадений 1.

ОБНОВЛЕНИЕ 1: Мэтт сказал в комментарии, что это регулярное выражение должно использоваться в Python. У Python немного другой синтаксис. Чтобы добиться того же результата в Python, используйте это регулярное выражение и передайте опцию re.IGNORECASEв функцию compileor match.

\W*(rocket)\W*

НаРегулярное выражение101это можно смоделировать, введя «i» в текстовое поле рядом с полем ввода регулярного выражения.

ОБНОВЛЕНИЕ 2Ismael упомянул, что регулярное выражение не совсем верно, так как оно может соответствовать "1rocket1". Он опубликовал гораздо лучшее решение, а именно

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

решение2

Я думаю, что в данном случае опережающие просмотры излишни, и лучше использовать границы слов с 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']

решение3

С grepи sedможно использовать \<rocket\>. С grepопцией -iсделает его нечувствительным к регистру (я(игнорировать регистр):

grep -i '\<rocket\>'

Я не знаю способа сделать все sedрегулярные выражения нечувствительными к регистру, но всегда есть пещерный способ:

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

решение4

Я думаю, вы можете использовать что-то вроде этого, чтобы конкретизировать нужное вам слово: /^(rocket|RoCKEt)$/g

Связанный контент