То, что вы хотите, немного сложно, если вы хотите сделать это только с помощью регулярных выражений.
Вместо этого вы можете использовать лямбду, чтобы условно заменить части строки, не являющиеся четырьмя цифрами, запятой и сохранить четыре цифры как есть. Попробуйте использовать этот код Python,
import re
s = "abc 23 [1981] ghj [5656]"
print(re.sub(r'\b(\d{4})\b|((?!\b\d{4}\b).)+', lambda x: x.group() if x.group(1) else ',', s))
Печатает следующее, как вы хотели,
,1981,5656,
То, что мы делаем здесь, это захват четырех цифр с использованием \b(\d{4})\b
в группе 1 и захват любых других одного или нескольких символов, которые не имеют четырех цифр, с использованием этого регулярного выражения ((?!\b\d{4}\b).)+
, и мы делаем условную замену, где, если сначала чередование сопоставляется, тогда group1 не является пустым, поэтому замените его сопоставленным текстом, а если group1 пусто, что означает совпадение второго регулярного выражения, то вместо этого замените его запятой.