2012-09-13 9 views
7

próbuję wypracować prostą funkcję do przechwytywania literówki, npszybki sposób podzielić alfa i numeryczne znaków w ciąg Pythona

"Westminister15" 
"Westminister15London" 
"23Westminister15London" 

po mocowaniu:

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

Pierwsza próba:

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 

wynik:

fixate("Westminister15London") 

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

Myślę jednak, że to może być bardziej skutecznie zrobić, a ja wciąż złe wyniki, gdy próbuję coś takiego:

fixate("Westminister15London England") 

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

oczywiście powinno rekrutującym London i England osobno, ale czuję, że moja funkcja dostanie nadmiernie połatany i tam prostsze podejście

to pytanie jest nieco równoważne this php pytanie

Odpowiedz

15

problemem jest to, że Pythona re.split() nie s plit na meczach o zerowej długości. Ale można uzyskać pożądany wynik z 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+ dopasowuje dowolną liczbę cyfr, [^\W\d_]+ pasuje dowolne słowo.

+0

Dzięki @TimPietzcker to świetnie –

3

Można użyć tej regex zamiast Twoja:

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

Następnie trzeba filtrować listę usuwanie pustych strun/white-space tylko ciągi.

5

Oto kolejny podejście w przypadku wolisz trzymać się z dala od regex, które czasami mogą być niewygodne, jeśli ktoś nie jest wystarczająco obeznany to zrobić/zmienić to sami:

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)) 

powraca:

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

Generator można łatwo modyfikować, aby w razie potrzeby nigdy nie poddawać białych znaków.

Powiązane problemy