Надо заменить в тексте все '/', кроме тех, которые находятся в сокращениях вида '<одна буква>/<одна буква>' (напр., 'к/ф', 'п/у'). Для примера рассматриваю только левую сторону контекста: перед чертой не должно быть последовательности из пробела или начала строки и одиночного символа.
re.sub('(?<!\s\S)/', ';', u' к/ф '))
re.sub('(?<!(^|\s)\S)/', ';', u' к/ф '))
re.sub('((?<!\s\S)|(?<!^\S))/', ';', u' к/ф '))
В моем случае можно обойтись первым вариантом с временным пришиванием пробелов к концам строки с последующим trim, но все же, как это делается правильно регулярками? Алсо, возможно ли в общем случае избавиться от ограничения fixed-width pattern? (я сначала пытался сделать обнаружение контекста в capture groups, но не нашел другого способа сделать отрицание выражения, кроме как использовать отрицательные look-*)