Предполагая, что скобки сбалансированы и не вложены, вот идея с re.split
.
>>> import re
>>>
>>> s = 'Hello (This . will be replaced, this one. too). This ... not but this (.).'
>>> ''.join(m.replace('.', ';') if m.startswith('(') else m
...: for m in re.split('(\([^)]+\))', s))
...:
'Hello (This ; will be replaced, this one; too). This ... not but this (;).'
Основной трюк заключается в том, чтобы обернуть регулярное выражение \([^)]+\)
другой парой ()
, такой, чтобыспички сохраняются.