2010-06-02 12 views
2

Je suis en train de commencer avec RegEx et je me demandais si quelqu'un pouvait me aider CRAFT une déclaration pour convertir les coordonnées comme suit:Remplacer «** » avec un saut de ligne utilisant l'expression rationnelle (ou quelque chose d'autre)

145.00694,-37.80421,9 145.00686,-37.80382,9 145.00595,-37.8035,16 145.00586,-37.80301,16 

à

145.00694,-37.80421 
145.00686,-37.80382 
145.00595,-37.8035 
145.00586,-37.80301 

(Décoller la virgule et de la valeur et la transformer en un saut de ligne.)

Je ne peux pas comprendre comment utiliser des caractères génériques pour faire quelque chose comme ça. Toute aide serait grandement appréciée! Merci.

+0

je ce http://www.regexlib.com/CheatSheet.aspx dans le passé pour écrire regex, ce qui est très utile. – VoodooChild

Répondre

3

« Certaines personnes, lorsqu'ils sont confrontés à un problème , pensez 'Je sais, je vais utiliser expressions régulières.' Maintenant ils ont deux problèmes. " - Jamie Zawinski

Évitez que les méthodes de problème et chaîne d'utilisation:

s="145.00694,-37.80421,9 145.00686,-37.80382,9 145.00595,-37.8035,16 145.00586,37.80301,16" 

lines = s.split(' ') # each line is separated by ' ' 
for line in lines: 
    a,b,c=line.split(',') # three parts, separated by ',' 
    print a,b 

Regex ont leur utilité, mais ce n'est pas un d'entre eux.

2
>>> import re 
>>> s="145.00694,-37.80421,9 145.00686,-37.80382,9 145.00595,-37.8035,16 145.00586,-37.80301,16" 
>>> print re.sub(",\d*\w","\n",s) 
145.00694,-37.80421 
145.00686,-37.80382 
145.00595,-37.8035 
145.00586,-37.80301 
+0

Fonctionne très bien! Merci beaucoup! – John

+0

Et ceci est un autre excellent exemple de la fragilité de regex: Cela ne fonctionne que tant que le 2ème nombre (-37.X) est négatif ... –

+0

Ouais je viens de le remarquer ... comment je le modifierais pour le rendre match ", [numéro à deux chiffres] [espace blanc]"? J'essaye ", \ d \ d \ w" mais cela ne semble pas fonctionner. – John

1

méthodes de cordes semblent suffire ici, regex sont Overkill:

>>> s='145.00694,-37.80421,9 145.00686,-37.80382,9 145.00595,-37.8035,16 145.00586,-37.80301,16' 
>>> print('\n'.join(line.rpartition(',')[0] for line in s.split())) 
145.00694,-37.80421 
145.00686,-37.80382 
145.00595,-37.8035 
145.00586,-37.80301 
0
>>> s = '145.00694,37.80421,9 145.00686,-37.80382,9 145.00595,-37.8035,16 145.00586,-37.80301,16 
>>> patt = '(%s,%s),%s' % (('[+-]?\d+\.?\d*',)*3) 
>>> m = re.findall(patt, s) 
>>> m 
['145.00694,37.80421', '145.00686,-37.80382', '145.00595,-37.8035', '145.00586,-37.80301'] 
>>> print '\n'.join(m) 
145.00694,37.80421 
145.00686,-37.80382 
145.00595,-37.8035 
145.00586,-37.80301 

mais je préfère pas utiliser des expressions régulières dans ce cas

J'aime SilentGhost solution