Ваше регулярное выражение начинается с \b(?<=\d)
и использует границу слова .Эта позиция будет соответствовать только в конце 1300598526
.Граница слова не совпадает между цифрами, поэтому часть, следующая за (?=(\d\d\d)+\b)
, не может совпадать.
Один из способов решения этой проблемы заключается в разделении пробела для получения слов.Затем сопоставьте каждый элемент и проверьте, состоит ли он из 4 или более цифр \A\d{4,}\Z
и добавьте запятую после 3 цифр, используя:
\d(?=(?:\d{3})+(?!\d))
Объяснение
\d
Совпадение с цифрой (?=
положительный прогноз, чтобы подтвердить, что справа - (?:\d{3})+
повторение наборов из 3 цифр (?!\d)
отрицательныйвзгляд вперед, чтобы утверждать, что справа не цифра
)
Закрыть положительный прогноз
Например:
import re
text = "The population 12test1234 of India is 1300598526 and growing."
pattern = re.compile(r"\d(?=(?:\d{3})+(?!\d))")
subst = r"\g<0>,"
res = map(lambda x: re.sub(pattern, subst, x) if re.match(r"\A\d{4,}\Z", x) else x, text.split(' '))
print (" ".join(res))
Результат
The population 12test1234 of India is 1,300,598,526 and growing.
См. Демонстрационную версию Regex | Python demo