2012-09-13 39 views
7

Tôi cố gắng để làm việc ra một chức năng đơn giản để nắm bắt lỗi chính tả, ví dụ:cách nhanh chóng để chia alpha và ký tự số trong một chuỗi python

"Westminister15" 
"Westminister15London" 
"23Westminister15London" 

sau fixating:

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

nỗ lực đầu tiên:

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 

kết quả:

fixate("Westminister15London") 

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

Tuy nhiên, tôi nghĩ rằng điều này có thể được thực hiện một cách hiệu quả hơn, và tôi vẫn có được kết quả xấu khi tôi thử một cái gì đó như:

fixate("Westminister15London England") 

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

Rõ ràng nó nên tranh thủ LondonEngland riêng biệt, nhưng tôi cảm thấy chức năng của tôi sẽ nhận được quá vá và theres một cách tiếp cận đơn giản hơn

câu hỏi này có phần tương đương với this php câu hỏi

Trả lời

15

vấn đề là Python của re.split() không s plit trên zero-length phù hợp. Nhưng bạn có thể nhận được kết quả mong muốn với 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+ khớp với bất kỳ số lượng chữ số, [^\W\d_]+ khớp với bất kỳ lời nào.

+0

Cảm ơn @TimPietzcker thật tuyệt vời –

3

Bạn có thể sử dụng regex này thay vì bạn:

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

Sau đó, bạn có để lọc danh sách loại bỏ chuỗi rỗng/trắng-không gian chỉ chuỗi.

5

Dưới đây là cách tiếp cận khác trong trường hợp bạn muốn tránh xa regex, mà đôi khi có thể khó sử nếu một người không đủ quen thuộc để làm cho nó/thay đổi nó tự:

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

lợi nhuận:

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

Máy phát điện cũng có thể dễ dàng sửa đổi để không bao giờ tạo ra các khoảng trắng nếu muốn.

Các vấn đề liên quan