s = 'the brown fox'
... lakukan sesuatu di sini ...
s
seharusnya :
'The Brown Fox'
Apa cara termudah untuk melakukan ini?
python
capitalization
capitalize
TIMEX
sumber
sumber
" ".join(w.capitalize() for w in s.split())
"e g 3b"
hasil yang diinginkan adalah"E G 3b"
. Namun,"e g 3b".title()
kembali"E G 3B"
.In [2]: 'tEst'.title() Out[2]: 'Test'
The
.title()
Metode tidak dapat bekerja dengan baik,Coba
string.capwords()
metode,Dari dokumen python pada capwords :
sumber
"There once was a string with an 'that had words right after it and then closed'"
. Dengan contoh ini semua dunia kecualithat
dikapitalisasi seperti yang diharapkan. Hasilnya adalah"There Once Was A String With An 'that Had Words Right After It And Then Closed'"
title()
untuk situasi normal. Dalam situasi saya,title()
mengembalikan output yang buruk untuk nama dengan aksen atau dieresis, sementaracapwords()
menanganinya dengan benar.Hanya karena hal semacam ini menyenangkan bagi saya, berikut adalah dua solusi lagi.
Pisahkan menjadi kata-kata, tutup awal setiap kata dari grup yang dibagi, dan bergabung kembali. Ini akan mengubah ruang putih yang memisahkan kata-kata menjadi satu ruang putih, tidak peduli apa itu.
EDIT: Saya tidak ingat apa yang saya pikirkan ketika saya menulis kode di atas, tetapi tidak perlu membuat daftar eksplisit; kita dapat menggunakan ekspresi generator untuk melakukannya dengan gaya malas. Jadi, inilah solusi yang lebih baik:
Gunakan ekspresi reguler untuk mencocokkan awal string, atau kata-kata yang memisahkan spasi putih, ditambah karakter non-spasi tunggal; gunakan tanda kurung untuk menandai "kelompok yang cocok". Tulis fungsi yang mengambil objek pencocokan, dan mengembalikan grup pencocokan spasi putih tidak berubah dan grup pencocokan karakter non-spasi putih dalam huruf besar. Kemudian gunakan
re.sub()
untuk mengganti polanya. Yang ini tidak memiliki masalah tanda baca dari solusi pertama, juga tidak mengulangi ruang putih seperti solusi pertama saya. Yang ini menghasilkan hasil terbaik.Saya senang saya meneliti jawaban ini. Saya tidak punya ide yang
re.sub()
bisa berfungsi! Anda dapat melakukan pemrosesan nontrivial di dalamre.sub()
untuk menghasilkan hasil akhir!sumber
string.capwords
, menurut dokumentasi dalam jawaban Chen Houwu.Berikut ini ringkasan berbagai cara untuk melakukannya, mereka akan bekerja untuk semua input ini:
- Solusi paling sederhana adalah dengan memecah kalimat menjadi kata-kata dan huruf besar huruf pertama kemudian bergabung kembali:
- Jika Anda tidak ingin membagi string input menjadi kata-kata terlebih dahulu, dan menggunakan generator mewah:
- Atau tanpa mengimpor itertools:
- Atau Anda dapat menggunakan ekspresi reguler, dari jawaban steveha :
Sekarang, ini adalah beberapa jawaban lain yang diposting, dan masukan yang tidak berfungsi seperti yang diharapkan jika kita menggunakan definisi kata sebagai awal kalimat atau apa pun setelah spasi kosong:
menggunakan '' untuk pemisahan akan memperbaiki output kedua, tetapi capwords () masih tidak akan berfungsi untuk yang pertama
Hati-hati dengan beberapa ruang kosong
sumber
lower 123 upper
harus kembalilower 123 Upper
, di manaupper
huruf kapital ditulis mengikuti angka. Saya tahu ini melampaui lingkup pertanyaan OP tetapi tambahan yang bagus untuk jawaban Anda yang sudah luas. Terima kasih sebelumnya."([0-9]+)(\s+.)"
alih-alih"(^|\s)(\S)"
(mencocokkan satu atau lebih angka, diikuti oleh satu atau lebih spasi, dan karakter apa pun setelah), atau"([0-9]+)(\s*.)"
jika Anda ingin menggunakan huruf besar karakter setelah spasi 'nol atau lebih' setelah numberWW1 - the great war
danWW1 - The Great War
bukannya keluaranWw1 ...
. Lihat masalah dengan singkatan? Apakah Anda bersedia menambahkan sesuatu yang menunjukkan kasus ini? Saya telah bertanya-tanya tentang ini untuk sementara waktu sekarang dan tidak dapat memikirkan cara untuk melakukannya.WW1
akan menampilkan sebagaiWW1
Versi copy-paste-ready dari @jibberia anwser:
sumber
str.join
menerima generator.join
menerima gen exps, Dalam kasusstr.join
khususnya, umumnya lebih disukai untuk menggunakan pemahaman daftar. Ini karenajoin
mengulangi dua kali argumen, dan karenanya lebih cepat untuk menyediakan daftar siap pakai daripada generator.str.join
perlu beralih dua kali atas argumen? Saya baru saja memeriksa - tidak. Padahal untuk urutan urutan kecil pemahamannya memang lebih cepat.Mengapa Anda menyulitkan hidup Anda dengan bergabung dan untuk loop ketika solusinya sederhana dan aman ??
Lakukan ini:
sumber
"the brown fox".capitalize()
?'this is John'
menjadi'This is john'
.string.capitalize()
(pada dasarnya menggemakan @ luckydonald)Jika str.title () tidak berfungsi untuk Anda, lakukan huruf besar sendiri.
Satu-liner:
Hapus contoh:
sumber
Andai saja Anda menginginkan huruf pertama:
Tetapi untuk memanfaatkan setiap kata:
sumber
'hello New York'.capitalize()
adalah'Hello new york'
String kosong akan memunculkan Kesalahan jika Anda mengakses [1:], oleh karena itu saya akan menggunakan:
untuk huruf besar hanya huruf pertama.
sumber
str.capitalize
?return title[:1].upper() + title[1:]
juga akan mengurus masalah itu karena mengiris string kosong seperti itu akan memberikan 2 string kosong, bergabung bersama membuat string kosong yang dikembalikanSeperti yang ditunjukkan Mark, Anda harus menggunakan
.title()
:Namun, jika ingin membuat huruf besar pertama di dalam template Django , Anda bisa menggunakan ini:
atau menggunakan variabel:
sumber
Metode yang disarankan str.title () tidak berfungsi di semua kasus. Sebagai contoh:
dari pada
"A B 3c"
.Saya pikir, lebih baik melakukan sesuatu seperti ini:
sumber
Meskipun semua jawabannya sudah memuaskan tetapi saya akan mencoba untuk menutupi 2 kasus tambahan bersama dengan semua kasus sebelumnya.
Di sini Anda bisa menggunakan ini
ini akan memberimu
Saya harap ini tidak berlebihan.
sumber
Untuk menggunakan huruf besar ...
@ Gary02127 komentar, di bawah judul karya solusi dengan tanda kutip
sumber
Jangan mengabaikan kelestarian ruang putih. Jika Anda ingin memproses
'fred flinstone'
dan mendapatkan'Fred Flinstone'
alih-alih'Fred Flinstone'
, Anda telah merusak ruang putih Anda. Beberapa solusi di atas akan kehilangan ruang putih. Inilah solusi yang bagus untuk Python 2 dan 3 dan mempertahankan ruang putih.sumber
Fungsi cepat bekerja untuk Python 3
sumber
Kapitalisasi string dengan spasi yang tidak seragam
Yah, saya mengerti ini adalah pertanyaan lama dan mungkin jawaban mungkin sudah hampir dihapus, tapi saya ingin menambahkan titik @Amit Gupta tentang ruang yang tidak seragam. Dari pertanyaan awal, kami ingin memanfaatkan setiap kata dalam string
s = 'the brown fox'
. Bagaimana jika string itus = 'the brown fox'
dengan spasi yang tidak seragam.sumber
** Jika Anda ingin berhemat **
sumber
Saya sangat suka jawaban ini:
Versi copy-paste-ready dari @jibberia anwser:
Tetapi beberapa baris yang saya kirim memisahkan beberapa karakter kosong yang menyebabkan kesalahan ketika mencoba melakukan s [1:]. Mungkin ada cara yang lebih baik untuk melakukan ini, tetapi saya harus menambahkan jika if (s)> 0, seperti pada
sumber