Регулярное выражение для проверки подслов между группами захвата - PullRequest
4 голосов
/ 05 июня 2019

Говоря о Regex, я сталкиваюсь с проблемой замены переносов в начальной части составного слова.

Например:

wo-wo-wo-wonder -> wonder hi-hi-hi-hi -> hi wo-wo-wo -> wo f-f-f-fight

Итакдля каждого слова внутри текста я хочу заменить слова, которые перед основным словом (wonder) имеют частичное или полное повторение основного слова (wo-wo-wo, но также wonder-wonder-wonder).В то же время составные слова, такие как bi-linear или pre-trained, НЕ ДОЛЖНЫ заменяться, потому что в этом случае перенос (pre) не является частью основного слова (train).

Я виделэто решение [ Python находит все вхождения дефисных слов и заменяет их в позиции ] и, по-видимому, это может быть хорошим решением.Но моя проблема совершенно иная, потому что я не хочу налагать ограничения на длину переноса, и в то же время я хочу проверить, является ли дефис частью основного слова.

Это Regex IЯ на самом деле использую, но, как объяснено, это не решает мою полную проблему.

re.sub(r'(?<!\S)(\w{1,3})(?:-\1)*-(\w+)(?!\S)', '\\2', s)

1 Ответ

2 голосов
/ 05 июня 2019

Используйте

r'(?<!\S)(\w+)(?:-\1)*-(\1)'

или

r'\b(\w+)(?:-\1)*-(\1)'

См. Демоверсию regex

информация

  • (?<!\S) - граница пробела (если вы используете \b, граница слова)
  • (\w+) - Группа 1: любое одно или несколько символов слова
  • (?:-\1)* - 0 или более повторений - и значения группы 1
  • - - дефис
  • (\1) - Группа 2: то же значение, что и в Группе 1.

Пример Python re.sub:

s = re.sub(r'(?<!\S)(\w+)(?:-\1)*-(\1)', r'\2', s)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...