Используйте отрицательный прогноз нулевой ширины, чтобы убедиться, что за заменяемыми подстроками (запятыми здесь) не следует {space(s)}{digit}
в конце:
,(?!\s+\d$)
Пример:
In [227]: text = '52A, XYZ Street, ABC District, 2'
In [228]: re.sub(',(?!\s+\d$)', '', text)
Out[228]: '52A XYZ Street ABC District, 2'
Edit:
Если у вас есть больше запятых после подстроки ,{space(s)}{digit}
и вы хотите сохранить их все, используйте отрицательный взгляд, чтобы убедиться, что перед запятыми не стоит {space}{digit<or>[A-Z]}
:
(?<!\s[\dA-Z]),(?!\s+\d,?)
Пример: * ** 1022 тысячу двадцать одна *
In [229]: text = '52A, XYZ Street, ABC District, 2, M, Brown'
In [230]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[230]: '52A XYZ Street ABC District, 2, M, Brown'
In [231]: text = '52A, XYZ Street, ABC District, 2'
In [232]: re.sub('(?<!\s[\dA-Z]),(?!\s+\d,?)', '', text)
Out[232]: '52A XYZ Street ABC District, 2'