import re
def successive_matches(pattern,text,pos=0):
ptrn = re.compile(pattern)
match = ptrn.match(text,pos)
while match:
yield match.group()
if match.end() == pos:
break
pos = match.end()
match = ptrn.match(text,pos)
if pos < len(text) - 1:
yield text[pos:]
for matched_text in successive_matches(r"('[^']*'|[^',]*),\s*","21, 2, '23.5R25 ETADT', 'description, with a comma'"):
print matched_text
aW1wb3J0IHJlCgpkZWYgc3VjY2Vzc2l2ZV9tYXRjaGVzKHBhdHRlcm4sdGV4dCxwb3M9MCk6CiAgcHRybiA9IHJlLmNvbXBpbGUocGF0dGVybikKICBtYXRjaCA9IHB0cm4ubWF0Y2godGV4dCxwb3MpCiAgd2hpbGUgbWF0Y2g6CiAgICB5aWVsZCBtYXRjaC5ncm91cCgpCiAgICBpZiBtYXRjaC5lbmQoKSA9PSBwb3M6CiAgICAgIGJyZWFrCiAgICBwb3MgPSBtYXRjaC5lbmQoKQogICAgbWF0Y2ggPSBwdHJuLm1hdGNoKHRleHQscG9zKQogIGlmIHBvcyA8IGxlbih0ZXh0KSAtIDE6CiAgCXlpZWxkIHRleHRbcG9zOl0KCmZvciBtYXRjaGVkX3RleHQgaW4gc3VjY2Vzc2l2ZV9tYXRjaGVzKHIiKCdbXiddKid8W14nLF0qKSxccyoiLCIyMSwgMiwgJzIzLjVSMjUgRVRBRFQnLCAnZGVzY3JpcHRpb24sIHdpdGggYSBjb21tYSciKToKCXByaW50IG1hdGNoZWRfdGV4dAo=