Следующий шаблон регулярного выражения приближается к тому, что вы хотите здесь:
(?<!\S)[1-9]\d{0,2}(?:,\d{3})*(?:\.\d+)?(?!\S)
Он использует поисковые запросы, чтобы утверждать, что границы для чисел должны быть либо пробелами, либо началом / концом ввода. Также обратите внимание, что мы настаиваем на том, чтобы каждое действительное число не начиналось с нуля.
Я бы использовал re.findall
следующим образом:
inp = "The net value is 1,000,000.00 however even 100,000 or 1,000,000 is acceptable. The amounts that are not acceptable are 1 000,000.00 or 1.000.000.00 or 1,000,000,00 or 1,000,000,0000"
matches = re.findall(r'(?<!\S)[1-9]\d{0,2}(?:,\d{3})*(?:\.\d+)?(?!\S)', inp)
print(matches)
Это печатает:
['1,000,000.00', '100,000', '1,000,000', '1']
В качестве примечания о том, почему 1
появляется в результате выше, нет очевидного способа узнать, что стандартное число 1
на самом деле является частью сломанного числа одного миллиона.