Как упомянуто gfdunn2, он выполняет "непрерывное сопоставление" всей строки. Есть пара вещей, которые вы можете сделать, чтобы контролировать это немного лучше, хотя.
Скобки {} ниже могут контролировать, сколько символов вы получите, поэтому это даст вам более точное соответствие.
>>> import re
#exactly 1 digit and %
>>> test = re.compile(r'[0-9]{1}%')
>>> print test.search("50%").group(0)
0%
#exactly 2 digits and %
>>> test = re.compile(r'[0-9]{2}%')
>>> print test.search("50%").group(0)
50%
#one or more digits
>>> test = re.compile(r'[0-9]+%')
>>> print test.search("50%").group(0)
50%
#in the event you want to include floating point percentages
>>> test = re.compile(r'[0-9.]+%')
>>> print test.search("50.4%").group(0)
50.4%
>>> print test.search("50.34%").group(0)
50.34%