Хорошо, я вижу, что происходит ... из документов:
Если в шаблоне присутствует одна или несколько групп, вернуть список групп;
это будет список кортежей, если шаблон содержит более одной группы.
Как выяснилось, у вас есть группа "(\ d + ,?)" ... так что она возвращает последнее вхождение этой группы или 000.
Одним из решений является окружение всего регулярного выражения такой группой, как эта
regex = re.compile('((\d+,?)+)')
тогда он вернет [('9,000,000', '000')], который является кортежем, содержащим обе сопоставленные группы. Конечно, вы заботитесь только о первом.
Лично я бы использовал следующее регулярное выражение
regex = re.compile('((\d+,)*\d+)')
чтобы избежать совпадений типа "это плохое число 9,123"
Edit.
Вот способ избежать необходимости заключать выражение в скобки или работать с кортежами
s = "..."
regex = re.compile('(\d+,?)+')
it = re.finditer(regex, s)
for match in it:
print match.group(0)
finditer возвращает итератор, который вы можете использовать для доступа ко всем найденным совпадениям. эти совпадающие объекты такие же, что и re.search, поэтому group (0) возвращает ожидаемый результат.