text = r'''"column1a","column2a","column
3a,",
"column\" this is, a test\" 4a"
"column1a2","column2a2","column3a2","column4a2"
"column1b","colu
mn2b,","column3b",
"column\" this is, a test\" 4b"
"column1c,","column2c","column3c",
"column\" this is, a test\" 4c"'''
import re
columns = 4
buffer = ""
check = re .compile ( r'"(?:[^"\\ ]*|\\ .)+"' )
for line in text.split ( "\n " ) :
if buffer == "" :
matches = check.findall ( line)
if len ( matches) == columns:
print matches
else :
buffer = line.strip ( )
else :
buffer = buffer + line.strip ( )
matches = check.findall ( buffer)
if len ( matches) == columns:
print matches
buffer = ""
elif len ( check.findall ( buffer) ) > columns:
print "Error: cannot parse line:\n " + buffer
buffer = ""
dGV4dCA9IHInJyciY29sdW1uMWEiLCJjb2x1bW4yYSIsImNvbHVtbgogIDNhLCIsCiJjb2x1bW5cInRoaXMgaXMsIGEgdGVzdFwiNGEiCiJjb2x1bW4xYTIiLCJjb2x1bW4yYTIiLCJjb2x1bW4zYTIiLCJjb2x1bW40YTIiCiJjb2x1bW4xYiIsImNvbHUKICAgICBtbjJiLCIsImNvbHVtbjNiIiwgICAgICAgICAgICAgCiJjb2x1bW5cInRoaXMgaXMsIGEgdGVzdFwiNGIiCiJjb2x1bW4xYywiLCJjb2x1bW4yYyIsImNvbHVtbjNjIiwKImNvbHVtblwidGhpcyBpcywgYSB0ZXN0XCI0YyInJycKCmltcG9ydCByZQoKY29sdW1ucyA9IDQKYnVmZmVyID0gIiIKCmNoZWNrID0gcmUuY29tcGlsZShyJyIoPzpbXiJcXF0qfFxcLikrIicpCgpmb3IgbGluZSBpbiB0ZXh0LnNwbGl0KCJcbiIpOgoJaWYgYnVmZmVyID09ICIiOgoJCW1hdGNoZXMgPSBjaGVjay5maW5kYWxsKGxpbmUpCgkJaWYgbGVuKG1hdGNoZXMpID09IGNvbHVtbnM6CgkJCXByaW50IG1hdGNoZXMKCQllbHNlOgoJCQlidWZmZXIgPSBsaW5lLnN0cmlwKCkKCWVsc2U6CgkJYnVmZmVyID0gYnVmZmVyICsgbGluZS5zdHJpcCgpCgkJbWF0Y2hlcyA9IGNoZWNrLmZpbmRhbGwoYnVmZmVyKQoJCWlmIGxlbihtYXRjaGVzKSA9PSBjb2x1bW5zOgoJCQlwcmludCBtYXRjaGVzCgkJCWJ1ZmZlciA9ICIiCgkJZWxpZiBsZW4oY2hlY2suZmluZGFsbChidWZmZXIpKSA+IGNvbHVtbnM6CgkJCXByaW50ICJFcnJvcjogY2Fubm90IHBhcnNlIGxpbmU6XG4iICsgYnVmZmVyCgkJCWJ1ZmZlciA9ICIiCgkKCQoJCgk=
stdout
['"column1a"', '"column2a"', '"column3a,"', '"column\\"this is, a test\\"4a"']
['"column1a2"', '"column2a2"', '"column3a2"', '"column4a2"']
['"column1b"', '"column2b,"', '"column3b"', '"column\\"this is, a test\\"4b"']
['"column1c,"', '"column2c"', '"column3c"', '"column\\"this is, a test\\"4c"']