Hey j'essaye de comprendre une expression régulière pour faire ce qui suit.
Voici ma ficelle
Place,08/09/2010,"15,531","2,909",650
Je dois séparer cette chaîne par la virgule. Bien qu'en raison de la virgule utilisée dans les champs de données numériques, la division ne fonctionne pas correctement. Donc, je veux supprimer les virgules dans les nombres avant d'exécuter le fractionnement de la chaîne.
Merci.
new_string = re.sub(r'"(\d+),(\d+)"', r'\1.\2', original_string)
Ceci substituera le ,
à l'intérieur des guillemets avec un .
et vous pouvez maintenant utiliser la méthode de scission de chaînes
>>> from StringIO import StringIO
>>> import csv
>>> r = csv.reader(StringIO('Place,08/09/2010,"15,531","2,909",650'))
>>> r.next()
['Place', '08/09/2010', '15,531', '2,909', '650']
Vous pouvez analyser une chaîne de ce format en utilisant pyparsing :
import pyparsing as pp
import datetime as dt
st='Place,08/09/2010,"15,531","2,909",650'
def line_grammar():
integer=pp.Word(pp.nums).setParseAction(lambda s,l,t: [int(t[0])])
sep=pp.Suppress('/')
date=(integer+sep+integer+sep+integer).setParseAction(
lambda s,l,t: dt.date(t[2],t[1],t[0]))
comma=pp.Suppress(',')
quoted=pp.Regex(r'("|\').*?\1').setParseAction(
lambda s,l,t: [int(e) for e in t[0].strip('\'"').split(',')])
line=pp.Word(pp.alphas)+comma+date+comma+quoted+comma+quoted+comma+integer
return line
line=line_grammar()
print(line.parseString(st))
# ['Place', datetime.date(2010, 9, 8), 15, 531, 2, 909, 650]
L'avantage est que vous analysez, convertissez et validez en quelques lignes. Notez que les ints sont tous convertis en ints et la date en une structure datetime.
Une autre façon de le faire en utilisant regex directement:
>>> import re
>>> data = "Place,08/09/2010,\"15,531\",\"2,909\",650"
>>> res = re.findall(r"(\w+),(\d{2}/\d{2}/\d{4}),\"([\d,]+)\",\"([\d,]+)\",(\d+)", data)
>>> res
[('Place', '08/09/2010', '15,531', '2,909', '650')]
a = """Place,08/09/2010,"15,531","2,909",650""".split(',')
result = []
i=0
while i<len(a):
if not "\"" in a[i]:
result.append(a[i])
else:
string = a[i]
i+=1
while True:
string += ","+a[i]
if "\"" in a[i]:
break
i+=1
result.append(string)
i+=1
print result
Résultat:['Place', '08/09/2010', '"15,531"', '"2,909"', '650']
Pas un grand fan d'expressions régulières à moins d'en avoir absolument besoin