2012-10-02 22 views
16

Tôi muốn sử dụng python re.split() để chia chuỗi thành từng từ riêng lẻ theo dấu cách, dấu phẩy và dấu chấm. Nhưng tôi không muốn "1,200" được chia thành ["1", "200"] hoặc ["1.2"] để được chia thành ["1", "2"].python re.split() để phân cách bằng dấu cách, dấu phẩy và dấu chấm, nhưng không phải trong các trường hợp như 1.000 hoặc 1,50

Ví dụ

l = "one two 3.4 5,6 seven.eight nine,ten" 

Kết quả sẽ được ["one", "two", "3.4", "5,6" , "seven", "eight", "nine", "ten"]

Trả lời

37

Sử dụng một lookahead tiêu cực và một lookbehind tiêu cực:

> s = "one two 3.4 5,6 seven.eight nine,ten" 
> parts = re.split('\s|(?<!\d)[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten'] 

Nói cách khác, bạn luôn chia bởi \s (khoảng trắng), và chỉ chia cho dấu phẩy và dấu chấm nếu chúng là không phải theo sau (?!\d) hoặc trước (?<!\d) bằng một chữ số.

DEMO.

EDIT: Theo nhận xét của @verdesmarald, bạn có thể muốn sử dụng sau đây thay vì:

> s = "one two 3.4 5,6 seven.eight nine,ten,1.2,a,5" 
> print re.split('\s|(?<!\d)[,.]|[,.](?!\d)', s) 
['one', 'two', '3.4', '5,6', 'seven', 'eight', 'nine', 'ten', '1.2', 'a', '5'] 

này sẽ chia "1.2,a,5" vào ["1.2", "a", "5"].

DEMO.

+2

Tôi nghĩ OP thực sự không muốn theo dõi * và * được tiến hành, thay vì hoặc, vì vậy nó phải là '(? verdesmarald

+0

@verdesmarald: Bạn có thể đúng, tôi đã chỉnh sửa câu trả lời của tôi để phản ánh điều đó, cảm ơn. –

3

Vì vậy, bạn muốn chia nhỏ trên dấu cách và trên dấu phẩy và dấu chấm không được bao quanh bởi các số. Điều này sẽ hoạt động:

r" |(?<![0-9])[.,](?![0-9])" 
Các vấn đề liên quan