Як слід написати регулярний вираз, щоб відповідати певному слову?


21

Я намагався спрацьовувати конкретний регекс, але не можу змусити його робити те, що мені потрібно.

В основному, я хочу, щоб він шукав РОКЕТ. Зворотній вираз повинен відповідати ROCKET у верхньому або нижньому регістрі та з пунктуацією або без, але не в частині іншого слова. Отже, регулярне вираження запустить будь-яке з них:

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

але НЕ спрацьовує на ROCKET, коли він знаходиться в чомусь подібному

Rocketeer
Sprocket

Я намагався це правильно встановити за допомогою генератора регексу в Інтернеті, але я не можу змусити його точно відповідати.


1
Це одна з тих [рідкісних] ситуацій, коли питання може бути краще підходить для переповнення стека. Обов’язково надайте мову та / або платформу, оскільки кожна мова має свої особливості. Наприклад, Windows. .Net та клас Regex . (Зазвичай, навпаки. Переповнення стека отримує сотні поза тематичних питань від розробників, які краще підходять для Super User).
jww

Відповіді:


14

Я пропоную розміщувати закладки для швидкого посилання на регулярне вираження MSDN

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

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

Що це зробить, це шукати нуль або більше (*) не алфавітно-цифрових символів (\ W) з наступною версією нечутливої ​​до регістру ракети ((? I) ракети (? - i)), а потім знову нуля або більше ( *) не алфавітно-цифрові символи (\ W). Додаткові дужки навколо терміна відповідності ракет призначають відповідність окремій групі. Таким чином, слово ракета буде в групі 1 матчу.

ОНОВЛЕННЯ 1: Метт сказав у коментарі, що цей регулярний гекс повинен використовуватися в python. У Python є дещо інший синтаксис. Щоб досягти такого ж результату в python, використовуйте цей регулярний вираз і передайте re.IGNORECASEпараметр до функції compileабо match.

\W*(rocket)\W*

У Regex101 це можна змоделювати, ввівши "i" у текстове поле поруч із вводом регулярного виразів.

ОНОВЛЕННЯ 2 Ісмаїл зазначив, що регулярний вираз не зовсім коректний, тому що він може відповідати "1rocket1". Він розмістив набагато краще рішення, а саме

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


1
Тестування цього тестерів за допомогою регексу в Інтернеті (наприклад, regex101.com ) показує це як недійсне і не відповідає прикладним рядкам, які я ввожу. Це призначено для використання у складі сценарію python. Чи має це значення, як це слід писати?
Кефка

1
так. ви можете побачити на regex101.com, що ви можете вибрати «аромат» регулярного виразу в лівій верхній частині, пітон трохи інший. Я оновлю свою відповідь еквівалентом python.
Ксасер

1
Дякую. Я вважав, що регекси в основному не залежать від мови.
Кефка

1
Вони повинні бути, але незначні відмінності в реалізації існують.
Xaser

2
І \W*(rocket)\W*сірники lrocketl. Це має бути (?:^|\W)(rocket)(?:$|\W)(без *і ви повинні перевірити, чи відповідає воно початку та / або кінці рядка).
Ісмаїл Мігель

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 дає точно такий же результат, як і рішення Ісмаїла, але може бути трохи елегантнішим.
Xaser

1

З grepі sed, ви можете використовувати \<rocket\>. З grep, -iопція зробить це нечутливим до регістру ( я gnore case):

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.