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


21

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

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

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

но НЕ срабатывает на ROCKET, когда он найден в чем-то вроде

Rocketeer
Sprocket

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


1
Это одна из тех [нечастых] ситуаций, когда вопрос лучше подходит для переполнения стека. Обязательно укажите язык и / или платформу, так как каждый язык имеет свои особенности. Например, Windows. .Net и класс Regex . (Как правило, все наоборот. Переполнение стека получает сотни вопросов не по теме от разработчиков, которые лучше подходят для Super User).
15.15

Ответы:


14

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

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

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

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

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

\W*(rocket)\W*

На Regex101 это можно смоделировать, введя «i» в текстовое поле рядом с вводом regex.

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

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


1
Тестирование с помощью онлайн-тестировщиков regex ( например, regex101.com ) показывает, что это неверные и не совпадающие примеры строк, которые я ввожу. Это предназначено для использования как часть скрипта Python. Имеет ли это какое-то значение в том, как это должно быть написано?
Кефка

1
Да, это так. Вы можете увидеть на regex101.com, что вы можете выбрать regex "flavour" в левом верхнем углу, python немного отличается. Я обновлю свой ответ эквивалентом Python.
Xaser

1
Спасибо. Я думал, что регулярные выражения в основном не зависят от языка.
Кефка

1
Они должны быть, но существуют незначительные различия в реализации.
Xaser

2
И \W*(rocket)\W*спички lrocketl. Это должно быть (?:^|\W)(rocket)(?:$|\W)(без, *и вы должны проверить, соответствует ли он началу и / или концу строки).
Исмаэль Мигель

10

Я думаю, что в этом случае заблаговременность слишком велика, и вам лучше использовать границы слов с ignorecaseопцией:

\brocket\b

Другими словами, в питоне:

>>> 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 дает тот же результат, что и решение Исмаэля, но может быть немного более элегантным.
Xaser

1

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

grep -i '\<rocket\>'

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

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

0

Используйте параметр «Искать только целые слова».

Что касается знаков препинания, вы не можете ответить на них, пока не узнаете вкус / аромат.

Это очень старая тема, поэтому опубликована для тех, кто может посетить позже. Те, кто создал поток, могли перейти к чему-то другому ... Нет?


Что whole words only optionиспользует grepили php? Извините, но ваш ответ не дает никакой дополнительной пользы по сравнению с другими ответами.
Toto
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.