Я пытаюсь заставить работать определенное регулярное выражение, но не могу заставить его делать то, что мне нужно.
По сути, я хочу, чтобы он искал 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
в функцию compile
or 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