Chuỗi phân tách Python dựa trên regex


114

Cách tốt nhất để chia một chuỗi như "HELLO there HOW are YOU"bằng các từ viết hoa (trong Python) là gì?

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


BIÊN TẬP:

Tôi đã thử:

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

Tuy nhiên, nó dường như không hoạt động.


2
Bạn đã thử những gì? - Bạn không thể tìm thấy re.split()?
Gareth Latty

5
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ó nhận được một ngoại lệ? (Nếu vậy, hãy đăng toàn bộ ngoại lệ) Bạn có nhận được kết quả sai?
Gareth Latty

Câu trả lời:


134

Tôi đề nghị

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

Kiểm tra bản trình diễn này .


5
Điều gì xảy ra khi bạn không sử dụng trình biên dịch?
Feelsbadman

3
Theo re docs , " hầu hết các phép toán biểu thức chính quy đều có sẵn dưới dạng các hàm cấp mô-đun và các phương thức RegexObject. Các hàm là các phím tắt không yêu cầu bạn phải biên dịch đối tượng regex trước, nhưng bỏ lỡ một số tham số tinh chỉnh " . Bạn có thể sử dụng re.split(re.split(pattern, string, maxsplit=0, flags=0))như đã đề cập trong các tài liệu được trích dẫn trước đây.
ZaydH

57

Bạn có thể sử dụng một cái nhìn trước:

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

Điều này sẽ phân chia tại mọi khoảng trống theo sau bởi một chuỗi các chữ cái viết hoa kết thúc bằng một ranh giới từ.

Lưu ý rằng dấu ngoặc vuông chỉ dành cho người đọc dễ đọc và cũng có thể bị bỏ qua.

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

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

Bây giờ điều này phân chia ở mọi khoảng trống theo sau bởi bất kỳ chữ cái viết hoa nào.


1
Tôi sẽ thay đổi re.split(r'[ ](?=[A-Z]+\b)', input)như thế nào để nó không tìm thấy chữ hoa? Ví dụ: Nó sẽ không khớp với "A"? Tôi đã thử re.split(r'[ ](?=[A-Z]{2,}+\b)', input). cảm ơn!

@JamesEggers Ý bạn là bạn muốn yêu cầu ít nhất hai chữ cái viết hoa để không bị tách thành những từ như thế Inào? re.split(r'[ ](?=[A-Z]{2,}\b)', input)Hãy làm nó.
Martin Ender

2
Tôi muốn đề nghị ít nhất [ ]+hoặc thậm chí có thể \W+bắt nhiều trường hợp hơn một chút. Tuy nhiên, một câu trả lời tốt.
georg

Tôi đã thử cách tiếp cận tương tự. Tuy nhiên, có một [ ]không làm việc cho tôi. Thay vào đó, tôi đã sử dụng \s. Bản regexp hoàn chỉnh phù hợp với tôi làre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk

0

Câu hỏi của bạn chứa chuỗi ký tự "\b[A-Z]{2,}\b" , nhưng điều đó \bcó nghĩa là khoảng trắng lùi, vì không có r-modifier.

Hãy thử: r"\b[A-Z]{2,}\b".

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.