2012-11-03 72 views
47

Cách tốt nhất để tách một chuỗi như "HELLO there HOW are YOU" bằng các từ viết hoa chữ thường (bằng Python) là gì?Chuỗi phân tách Python dựa trên regex

Vì vậy, tôi muốn kết thúc với một mảng như ví dụ: results = ['HELLO there', 'HOW are', 'YOU']


EDIT:

Tôi đã thử:

p = re.compile("\b[A-Z]{2,}\b") 
print p.split(page_text) 

Nó dường như không làm việc, mặc dù .

+2

[Bạn đã thử gì] (http://www.whathaveyoutried.com)? - Bạn không thể tìm thấy ['' re.split() ''] (http://docs.python.org/3/library/re.html#re.split)? –

+1

Khi bạn nói điều gì đó không hiệu quả, bạn nên giải thích tại sao. Bạn có ngoại lệ không? (Nếu có, hãy đăng toàn bộ ngoại lệ) Bạn có nhận được kết quả sai không? –

Trả lời

55

Tôi đề nghị

l = re.compile("(?<!^)\s+(?=[A-Z])(?!.\s)").split(s) 

Kiểm tra this demo.

7

Bạn không cần phải phân chia, nhưng thay vì findall:

re.findall(r'[A-Z]+[^A-Z]*', str) 
+2

Điều đó chia tách ở các chữ cái viết hoa liên tiếp không phải các từ viết hoa –

+2

@ m.buettner: Tôi không biết ý của bạn là "từ". – georg

+0

Xem ví dụ của anh ấy. Một từ hoàn toàn viết hoa. Và tôi sẽ nhận lời, như một cái gì đó giữa ranh giới từ (regex). Bạn sẽ chia 'someThing' giữa' some' và 'Thing' –

25

Bạn có thể sử dụng một lookahead:

re.split(r'[ ](?=[A-Z]+\b)', input) 

này sẽ chia ở mọi không gian mà được theo sau bởi một chuỗi các thượng các ký tự chữ cái kết thúc bằng một từ.

Lưu ý rằng các dấu ngoặc vuông chỉ dành cho khả năng đọc và cũng có thể bỏ qua.

Nếu nó là đủ mà chữ cái đầu tiên của một từ là chữ hoa (vì vậy nếu bạn muốn chia trước Hello cũng) nó được dễ dàng hơn:

re.split(r'[ ](?=[A-Z])', input) 

Bây giờ này chia ở mọi không gian được theo sau bởi bất kỳ chữ hoa nào.

+1

Làm thế nào tôi thay đổi 're.split (r '[ ] (? = [AZ] + \ b) ', đầu vào) 'vì vậy nó không tìm thấy chữ hoa? Ví dụ. Nó sẽ không phù hợp với "A"? Tôi đã thử 're.split (r '[] (? = [A-Z] {2,} + \ b)', đầu vào)'. cảm ơn! –

+0

@ JamesEggers Bạn có nghĩa là bạn muốn yêu cầu ít nhất hai chữ hoa, để bạn không chia nhỏ các từ như 'I'? 're.split (r '[] (? = [A-Z] {2,} \ b)', đầu vào)' nên làm điều đó. –

+2

Tôi khuyên bạn nên sử dụng ít nhất '[] +' hoặc thậm chí là '\ W +' để bắt được nhiều trường hợp hơn. Tuy nhiên, một câu trả lời hay. – georg

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