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