web-dev-qa-db-fra.com

Regex Python remplacer

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. 

24
Ciarán
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 

49
spowers
>>> 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']
26
kojiro

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. 

1
dawg

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')]
1
Morten Kristensen
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

0
Robus