Вот регулярное выражение, которое вы можете использовать:
regex = re.compile(r'^\$?(\d*(\d\.?|\.\d{1,2}))$')
Вот испытательный стенд, который я использовал, чтобы проверить его. Я включил все ваши тесты, а также некоторые мои собственные. Я также включил некоторые отрицательные тесты, поскольку удостовериться, что они не совпадают, когда они не должны, так же важно, как убедиться, что они совпадают, когда это должно.
tests = [
('.50', True),
('50', True),
('50.00', True),
('50.0', True),
('$5000', True),
('$.50', True),
('$5.', True),
('$5.000', False),
('5000$', False),
('$5.00$', False),
('$-5.00', False),
('$5,00', False),
('', False),
('$', False),
('.', False),
]
import re
regex = re.compile(r'^\$?(\d*(\d\.?|\.\d{1,2}))$')
for test, expected in tests:
result = regex.match(test)
is_match = result is not None
print test + '\t' + ('OK' if is_match == expected else 'Fail')
Чтобы получить значение без $, вы можете использовать захваченную группу:
print result.group(1)