Вы можете использовать
re.sub(r'(\[[^][]*?)\s*\([A-Z]*\)\s*([^][]*])', r'\1\2', text)
См. Демоверсию regex
Подробности
(\[[^][]*?)
- Группа 1: [
, а затем любые 0+ символов, кроме [
и ]
, как можно меньше \s*
- 0+ пробелов \(
-a (
char [A-Z]*
- 0+ прописных букв ASCII \)
- )
char \s*
- 0+ пробелов ([^][]*])
- Группа 2: любые 0+ символов, кроме ]
и [
(столько, сколько возможно), а затем ]
Демонстрация Python:
import re
rx = r"(\[[^][]*?)\s*\([A-Z]*\)\s*([^][]*])"
s = "_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI"
print( re.sub(rx, r'\1\2', s) )
# => _AHDHDUHD[Tsfs]AHUDSHDI
Другая идея: удалить только все \s*\([A-Z]+\)\s*
совпадений, если они найдены внутри [...]
подстрок:
import re
s = "_AHDHDUHD[Tsfs (SGYA)]AHUDSHDI"
print( re.sub(r"\[[^][]+]", lambda x: re.sub(r'\s*\([A-Z]+\)\s*', "", x.group()), s) )
# => _AHDHDUHD[Tsfs]AHUDSHDI
См. еще одну демонстрацию Python .
Здесь шаблон \[[^][]+]
найдет все фрагменты [
, затем 1+ символов, кроме квадратных скобок, а затем ]
, а затем любые вхождения 0+ пробелов, (
, 1+ заглавные буквы ASCII, )
и 0+ пробелы будут удалены только внутри найденных совпаденийс рисунком \[[^][]+]
.