2012-09-13 12 views
7

Sto cercando di elaborare una semplice funzione per catturare errori di battitura, per esempio:modo veloce per dividere alfa e caratteri numerici in una stringa di pitone

"Westminister15" 
"Westminister15London" 
"23Westminister15London" 

dopo fissarsi:

["Westminister", "15"] 
["Westminister", "15", "London"] 
["23", "Westminister", "15", "London"] 

Primo tentativo:

def fixate(query): 
    digit_pattern = re.compile(r'\D') 
    alpha_pattern = re.compile(r'\d') 
    digits = filter(None, digit_pattern.split(query)) 
    alphas = filter(None, alpha_pattern.split(query)) 
    print digits 
    print alphas 

risultato:

fixate("Westminister15London") 

> ['15'] 
> ['Westminister', 'London'] 

Tuttavia, credo che questo potrebbe essere fatto in modo più efficace, e ho ancora ottenere cattivi risultati quando provo qualcosa di simile:

fixate("Westminister15London England") 

> ['15'] 
> ['Westminister', 'London England'] 

Ovviamente dovrebbe arruolarsi London e England separatamente, ma mi sento la mia funzione otterrà eccessivamente rattoppato e c'è un approccio più semplice

questa domanda è un po 'equivalente alla domanda this php

risposta

15

Il problema è che Python di re.split() non s plit su partite a lunghezza zero. Ma è possibile ottenere il risultato desiderato con re.findall():

>>> re.findall(r"[^\W\d_]+|\d+", "23Westminister15London") 
['23', 'Westminister', '15', 'London'] 
>>> re.findall(r"[^\W\d_]+|\d+", "Westminister15London England") 
['Westminister', '15', 'London', 'England'] 

\d+ corrisponde ogni numero di cifre, [^\W\d_]+ corrisponde qualsiasi parola.

+0

Grazie a @TimPietzcker è fantastico –

3

È possibile utilizzare questa espressione regolare al posto del tuo:

>>> import re 
>>> regex = re.compile(r'(\d+|\s+)') 
>>> regex.split('Westminister15') 
['Westminister', '15', ''] 
>>> regex.split('Westminister15London England') 
['Westminister', '15', 'London', ' ', 'England'] 
>>> 

poi si deve filtrare l'elenco di rimuovere le stringhe vuote/white-space solo stringhe.

5

Ecco un altro approccio nel caso in cui si preferisce stare lontano da regex, che a volte può essere ingombrante se non si è abbastanza familiare per rendere/modificare se stessi:

a = "Westminister15" 
b = "Westminister15London" 
c = "23Westminister15London" 
d = "Westminister15London England" 

def split_text(s): 
    from itertools import groupby 
    for k,g in groupby(s, str.isalpha): 
     yield ''.join(list(g)) 

print list(split_text(a)) 
print list(split_text(b)) 
print list(split_text(c)) 
print list(split_text(d)) 

rendimenti:

['Westminister', '15'] 
['Westminister', '15', 'London'] 
['23', 'Westminister', '15', 'London'] 
['Westminister', '15', 'London', ' ', 'England'] 

Il generatore può essere facilmente modificato, per non produrre mai stringhe di spazi vuoti, se lo si desidera.

Problemi correlati