2011-01-14 38 views
7

Trong Python, tôi muốn chia chuỗi bằng cách sử dụng danh sách các dấu tách. Các dấu tách có thể là dấu phẩy hoặc dấu chấm phẩy. Khoảng trắng nên được loại bỏ trừ khi nó nằm ở giữa các ký tự không dấu cách, không dấu cách, trong trường hợp đó cần phải giữ nguyên khoảng trắng.Python: Chia chuỗi theo danh sách các dấu tách

trường hợp thử nghiệm 1: ABC,DEF123,GHI_JKL,MN OP
Kiểm tra trường hợp 2: ABC;DEF123;GHI_JKL;MN OP
Kiểm tra trường hợp 3: ABC ; DEF123,GHI_JKL ; MN OP

Âm thanh như một trường hợp cho biểu thức thông thường, mà là tốt, nhưng nếu nó dễ dàng hơn hoặc sạch hơn để làm điều đó một cách khác điều đó sẽ còn tốt hơn nữa.

Cảm ơn!

Trả lời

15

này cần được nhanh hơn nhiều sau đó regex và bạn có thể vượt qua một danh sách các seperators như bạn muốn:

def split(txt, seps): 
    default_sep = seps[0] 

    # we skip seps[0] because that's the default seperator 
    for sep in seps[1:]: 
     txt = txt.replace(sep, default_sep) 
    return [i.strip() for i in txt.split(default_sep)] 

Làm thế nào để sử dụng nó: test

>>> split('ABC ; DEF123,GHI_JKL ; MN OP', (',', ';')) 
['ABC', 'DEF123', 'GHI_JKL', 'MN OP'] 

Hiệu suất:

import timeit 
import re 


TEST = 'ABC ; DEF123,GHI_JKL ; MN OP' 
SEPS = (',', ';') 


rsplit = re.compile("|".join(SEPS)).split 
print(timeit.timeit(lambda: [s.strip() for s in rsplit(TEST)])) 
# 1.6733491150007467 

print(timeit.timeit(lambda: split(TEST, SEPS))) 
# 1.6442800510003508 
+1

Rất đẹp. Phải chọn câu trả lời này là câu trả lời hay nhất. cảm ơn tất cả! – blah238

+0

SO nén các khoảng trắng, có nhiều hơn hai khoảng trống liên tiếp trong chuỗi ở trên – fabrizioM

+0

Rất may sẽ luôn có dấu phẩy hoặc dấu chấm phẩy. – blah238

5

Sử dụng biểu thức thông thường, hãy thử

[s.strip() for s in re.split(",|;", string)] 

hoặc

[t.strip() for s in string.split(",") for t in s.split(";")] 

không.

+0

Thay vì làm điều đó thông qua 'tách()' của chuỗi để tránh nhập 're', ví dụ: ''ABC, DEF123, GHI_JKL, MN OP'.split (', |; ')' – marcog

+1

@macrog: Điều này sẽ không tách chuỗi ở tất cả các sự xuất hiện đúng nguyên văn của '", |; "'? –

+0

Hoạt động tuyệt vời !! Cảm ơn :) – blah238

0
>>> re.split('\s*,\s*|\s*;\s*', 'a , b; cdf') 
['a', 'b', 'cdf'] 
0

Tham gia e ở trên câu trả lời, với các trường hợp thử nghiệm của bạn, bạn muốn sử dụng cụm từ thông dụng và một hoặc nhiều ký tự tách rời. Trong trường hợp của bạn, các ký tự tách có vẻ là ',', '|', ';' và khoảng trắng. Khoảng trắng trong python là '\ w', do đó hiểu là:

import re 
list = [s for s in re.split("[,|;\W]+", string)] 

tôi không thể trả lời của Sven trả lời ở trên, nhưng tôi chia trên một hoặc nhiều ký tự bên trong dấu ngoặc, và không cần phải sử dụng phương thức strip().

Yikes, tôi không đọc câu hỏi chính xác ... Câu trả lời của Sven với tác phẩm dải; tôi giả định khoảng trắng là một sự tách biệt khác.

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