Вы можете использовать 2 группы захвата с поиском, а в замене использовать лямбда, чтобы проверить, какая группа совпала.
Если группа 1 совпала, удалите последний символ. Если совпала группа 2, добавьте дефис.
([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))
Пояснение
(
Захват группа 1 [A-Z]-(?=[A-Z])
Сопоставьте AZ и - и подтвердите, что справа - AZ
)
Закрыть группу |
Или (
Захват группа 2 [A-Z](?=[0-9])
Сопоставьте AZ и подтвердите, что справа - di git |
Или [0-9](?=[A-Z])
Сопоставьте 0-9 и подтвердите, что справа - AZ
)
Закрытая группа
Regex demo | Python демо
Пример кода
import re
pattern = r"([A-Z]-(?=[A-Z]))|([A-Z](?=[0-9])|[0-9](?=[A-Z]))"
strings = [
"A-BA",
"A-B-BAB",
"9AHYA7",
"977AB99T5",
"HS98743YVJUHGF78BF8HH3JHFC83438VUN5498FCNG",
"7267-VHSBVH8737HHC8C-HYHFWYFHH-7Y84743YR8437G"
]
for str in strings:
result = re.sub(
pattern,
lambda x: x.group(1)[:-1] if x.group(1) else x.group(2) + "-",
str
)
print(result)
Вывод
ABA
ABBAB
9-AHYA-7
977-AB-99-T-5
HS-98743-YVJUHGF-78-BF-8-HH-3-JHFC-83438-VUN-5498-FCNG
7267-VHSBVH-8737-HHC-8-CHYHFWYFHH-7-Y-84743-YR-8437-G