Если немного изменить правила, это может сработать:
import re
p = re.compile(r"((?:^[^']*')?[^']*?(?:'[^']*'[^']*?)*?)(-{2,})")
txt = "xxxx rt / $ 'dfdf--fggh-dfgdfg' ghgh- dddd -- 'dfdf' ghh-g '--ggh--' vcbcvb"
print re.sub(p, r'\1-', txt)
Выход:
xxxx rt / $ 'dfdf-fggh-dfgdfg' ghgh- dddd -- 'dfdf' ghh-g '-ggh-' vcbcvb
Регулярное выражение:
( # Group 1
(?:^[^']*')? # Start of string, up till the first single quote
[^']*? # Inside the single quotes, as few characters as possible
(?:
'[^']*' # No double dashes inside theses single quotes, jump to the next.
[^']*?
)*? # as few as possible
)
(-{2,}) # The dashes themselves (Group 2)
Если есть разные разделители для начала и конца, вы можете использовать что-то вроде этого:
-{2,}(?=[^'`]*`)
Редактировать: Я понял, что если строка не содержит кавычек, она будет соответствовать всем двойным тире в строке. Один из способов исправить это было бы изменить
(?:^[^']*')?
в начале
(?:^[^']*'|(?!^))
Обновлено регулярное выражение:
((?:^[^']*'|(?!^))[^']*?(?:'[^']*'[^']*?)*?)(-{2,})