Python membagi string berdasarkan regex

114

Apa cara terbaik untuk membagi string seperti "HELLO there HOW are YOU"dengan kata-kata huruf besar (dengan Python)?

Jadi saya akan berakhir dengan array seperti ini: results = ['HELLO there', 'HOW are', 'YOU']


EDIT:

Saya telah mencoba:

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

Tapi sepertinya tidak berhasil.

Toto
sumber
2
Apa yang sudah kamu coba ? - Anda tidak dapat menemukan re.split()?
Gareth Latty
5
Saat Anda mengatakan sesuatu tidak berhasil, Anda harus menjelaskan alasannya. Apakah Anda mendapat pengecualian? (Jika demikian, posting seluruh pengecualian) Apakah Anda mendapatkan hasil yang salah?
Gareth Latty

Jawaban:

134

saya menyarankan

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

Lihat demo ini .

Ωmega
sumber
5
apa yang terjadi jika Anda tidak menggunakan kompilasi?
Feelsbadman
3
Menurut dokumen regex , " sebagian besar operasi ekspresi reguler tersedia sebagai fungsi tingkat modul dan metode RegexObject. Fungsinya adalah pintasan yang tidak mengharuskan Anda untuk mengompilasi objek regex terlebih dahulu, tetapi melewatkan beberapa parameter penyesuaian. " Anda dapat menggunakan re.split(re.split(pattern, string, maxsplit=0, flags=0))seperti yang disebutkan dalam dokumen yang dikutip sebelumnya.
ZaydH
57

Anda bisa menggunakan lookahead:

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

Ini akan terbagi di setiap spasi yang diikuti oleh serangkaian huruf besar yang diakhiri dengan batas kata.

Perhatikan bahwa tanda kurung siku hanya untuk keterbacaan dan juga bisa dihilangkan.

Jika cukup bahwa huruf pertama dari sebuah kata adalah huruf besar (jadi jika Anda ingin membagi di depannya Hellojuga) akan lebih mudah:

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

Sekarang ini terbagi di setiap ruang diikuti oleh huruf besar apa pun.

Martin Ender
sumber
1
Bagaimana saya mengubahnya re.split(r'[ ](?=[A-Z]+\b)', input)sehingga tidak menemukan huruf besar? Misalnya tidak cocok dengan "A"? Saya sudah mencoba re.split(r'[ ](?=[A-Z]{2,}+\b)', input). Terima kasih!
@JamesEggers Maksud Anda Anda ingin meminta setidaknya dua huruf besar, sehingga Anda tidak terpecah pada kata-kata seperti I? re.split(r'[ ](?=[A-Z]{2,}\b)', input)harus melakukannya.
Martin Ender
2
Saya akan menyarankan setidaknya [ ]+atau bahkan mungkin \W+untuk menangkap lebih banyak kasus. Tetap saja, jawaban yang bagus.
georg
Saya mencoba pendekatan yang sama. Namun, memiliki [ ]tidak berhasil untuk saya. Sebagai gantinya, saya menggunakan \s. Regexp lengkap yang berhasil untuk saya adalahre.split("\s(?=[A-Z]+\s)", string)
h3xh4wk
0

Pertanyaan Anda berisi string literal "\b[A-Z]{2,}\b", tapi itu \bberarti backspace, karena tidak ada r-modifier.

Cobalah: r"\b[A-Z]{2,}\b".

druid62
sumber