10

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

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

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

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

Rocketeer
Sprocket

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

3 ответа3

8

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

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

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

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

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

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

\W*(rocket)\W*

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

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

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

0

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

grep -i '\<rocket\>'

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

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .