LINUX.ORG.RU

И снова про регулярки: замена в контексте

 , ,


0

1

Надо заменить в тексте все '/', кроме тех, которые находятся в сокращениях вида '<одна буква>/<одна буква>' (напр., 'к/ф', 'п/у'). Для примера рассматриваю только левую сторону контекста: перед чертой не должно быть последовательности из пробела или начала строки и одиночного символа.

re.sub('(?<!\s\S)/', ';', u' к/ф '))
- работает, но мне надо учесть, что а/б может находиться в начале строки.
re.sub('(?<!(^|\s)\S)/', ';', u' к/ф '))
- ругань на «look-behind requires fixed-width pattern» - похоже, специфичное для питона ограничение, причем оно даже не смотрит, что по обе стороны от '|' стоят варианты одинаковой длины.
re.sub('((?<!\s\S)|(?<!^\S))/', ';', u' к/ф '))
- ошибок нет, но замена на ; происходит везде - и в случае, если перед '/' начало строки и символ (что должен запрещать первый look-behind), и если перед '/' пробел и символ (что должен запрещать второй look-behind)

В моем случае можно обойтись первым вариантом с временным пришиванием пробелов к концам строки с последующим trim, но все же, как это делается правильно регулярками? Алсо, возможно ли в общем случае избавиться от ограничения fixed-width pattern? (я сначала пытался сделать обнаружение контекста в capture groups, но не нашел другого способа сделать отрицание выражения, кроме как использовать отрицательные look-*)

★★

Последнее исправление: shatsky (всего исправлений: 2)

А не проще сначала исключить исключения (заменить 'А/А' на !!!replmeАА!!!), потом прогнать правило безусловной замены и уже потом восстановить всё назад?

ziemin ★★
()
Ответ на: комментарий от ziemin

Так тут же проблемы с поиском исключений (комбинированное условие «с пробелом или началом строки перед буквой»). Больше всего удивляет то, что третий вариант работает неправильно.

shatsky ★★
() автор топика

s:(?<=\B.)/|/(?=.\B):;:g?

arsi ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.