Сопоставление нескольких групп символов с регулярными выражениями python - PullRequest
1 голос
/ 18 апреля 2019

В рамках некоторых правил лемматизации я пытаюсь сформировать регулярное выражение, которое будет соответствовать строкам, оканчивающимся на 'ses', 'zes', 'xes', 'ches' или 'shes', и у меня возникли трудности получить правильные группировки букв. Я думал, что следующее будет работать ...

re.fullmatch(r'.*[szx(ch)(sh)]es\b', infl)

но я вижу, что это будет соответствовать окончанию слов "ces" или "hes", где я хочу, чтобы оно совпадало только с окончаниями слова "ches" (то же самое для группировки (sh)). Должно быть, я неправильно понимаю, как правильно объединять группы. Всякий раз, когда я ставлю скобку вокруг набора групп, я сопоставляю все буквы внутри, а не только комбинации букв.

Как мне сделать так, чтобы выражение fullmatch работало правильно? Должно быть, я неправильно понимаю, как работает объединение групп, поэтому краткое объяснение этого в этом контексте также будет полезно.

Кстати ... Мне нужен только верный / ложный возврат. Меня не интересуют возвращаемые значения.

Вот некоторые подходящие примеры: увольнение, вальсы, индексы, отрывы, различия.

1 Ответ

3 голосов
/ 18 апреля 2019

Ваше регулярное выражение не работает правильно даже в Java, так как группировки не поддерживаются внутри классов символов. ( и ) обрабатываются как буквальные скобки внутри [...].

fullmatch требует полного совпадения строк, и если вам все равно, что было в начале, просто используйте re.search и закрепите шаблон в конце.

Используйте

re.search(r'(?:[zx]|ch|sh?)es$', s)

См. Демонстрационный пример regex и график Regulex :

enter image description here

информация

  • (?:[zx]|ch|sh?) - группа без захвата , соответствующая любому из
    • [zx] - z или x
    • | - или
    • ch - ch последовательность символов
    • | - или
    • sh? - s или sh
  • es - es подстрока
  • $ - конец строки.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...