2015-06-29 8 views
5

risultati di Google Maps sono spesso rappresentati in tal modo:Come dividere Python da un personaggio mantenendo questo carattere?

enter image description here

'\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n' 

Un'altra variazione:

enter image description here

'Clayton Village Shopping Center, 14856 Clayton Rd\nChesterfield, MO, United States\n(636) 227-2844' 

E un altro:

enter image description here

'Wildwood, MO\nUnited States\n(636) 458-7707' 

Avviso la variazione nel posizionamento delle \n caratteri.

Sto cercando di estrarre le prime linee X come indirizzo e l'ultima riga come numero di telefono. Un'espressione regolare come (.*\n.*)\n(.*) sarebbe sufficiente per il primo esempio, ma non è sufficiente per gli altri due. L'unica cosa su cui posso contare è che il numero di telefono sarà nel formato (ddd) ddd-dddd.

Penso che una regex che consentirà ogni variazione possibile sarà difficile da trovare. È possibile utilizzare split(), ma mantenere il carattere che abbiamo diviso? Quindi, in questo esempio, diviso per "(", per dividere l'indirizzo e il numero di telefono, ma conservare questo carattere nel numero di telefono? Potrei concatenare lo "(" allo split("(")[1], ma esiste un modo più ordinato?

+2

un modo più semplice: leggere la linea di corda per riga . Quando la linea non corrisponde al numero di telefono, memorizzarlo nella variabile dell'indirizzo (un elenco), quando il modello corrisponde a memorizzare il risultato nella variabile del telefono e unire l'elenco di indirizzi con '\ n' per ottenere una stringa. –

+0

Vuoi farlo solo con gli indirizzi degli Stati Uniti? –

risposta

7

Non utilizzare regex. Basta dividere la stringa su '\n'. L'ultimo indice è un numero di telefono, gli altri indici sono l'indirizzo.

lines = inputString.split('\n') 
phone = lines[-1] if lines[-1].match(REGEX_PHONE_US) else None 
address = '\n'.join(lines[:-1]) if phone else inputString 

Python ha un sacco di grande costruito in strumenti per la manipolazione di stringhe in un ... modo più umano ... di regex consente.

+2

Le espressioni regolari sarebbero utili per verificare che l'ultima riga sia in effetti un numero di telefono. –

+3

Inoltre, _check_ che l'ultimo elemento è un numero di telefono, nel caso in cui la posizione non abbia un numero di telefono registrato: 'telefono = linee [-1] se le linee [-1] .match (REGEX_PHONE_US) altro Nessuno' dove' REGEX_PHONE_US' è un modello compilato definito altrove. –

+1

@ALtheX: mescolato alla mia risposta. – ArtOfWarfare

1

Se ho capito bene, si vuole "estrarre le prime linee X come indirizzo". Supponendo che tutti gli indirizzi di cui hai bisogno siano negli Stati Uniti questo codice di regex dovrebbe funzionare per te.In ogni caso, funziona sui 3 esempi forniti:

import re 
x = 'Wildwood, MO\nUnited States\n(636) 458-7707' 
print re.findall(r'.*\n+.*\States', x) 

l'output è:

['Wildwood, MO\nUnited States'] 

Se si desidera stampare in un secondo momento, senza la \n si può fare in questo modo:

x = '\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n' 
y = re.findall(r'.*\n+.*\States', x) 
y = y[0].rstrip() 

Quando si stampa y l'output:

113 W 5th St 
Eureka, MO, United States 

E, se si desidera estrarre il numero di telefono a parte si può fare questo:

tel = '\n113 W 5th St\nEureka, MO, United States\n(636) 938-9310\n' 
num = re.findall(r'.*\d+\-\d+', tel) 
num = num[0].rstrip() 

Quando si stampa num l'output:

(636) 938-9310 
+0

Funziona bene, grazie Joe. – Pyderman

+0

@Pyderman Ottimo! Sono felice di aiutare. –

Problemi correlati