Contoh:
>>> convert('CamelCase')
'camel_case'
python
camelcasing
Sridhar Ratnakumar
sumber
sumber
NotCamelCase
tapithisIs
Jawaban:
Kasing unta untuk kasing ular
Jika Anda melakukan ini berulang kali dan yang di atas lambat, kompilasi regex sebelumnya:
Untuk menangani kasus yang lebih canggih secara khusus (ini tidak dapat dibalik lagi):
Case ular ke case unta
sumber
not_camel_case
kenotCamelCase
dan / atauNotCamelCase
?s2.replace('__', '_')
Ada perpustakaan infleksi dalam indeks paket yang dapat menangani hal-hal ini untuk Anda. Dalam hal ini, Anda akan mencari
inflection.underscore()
:sumber
Saya tidak tahu mengapa ini semua sangat menyulitkan.
untuk sebagian besar kasus, ekspresi sederhana
([A-Z]+)
akan berhasilUntuk mengabaikan karakter pertama cukup tambahkan tampilan di belakang
(?!^)
Jika Anda ingin memisahkan ALLCaps ke all_caps dan mengharapkan angka dalam string Anda, Anda masih tidak perlu melakukan dua run terpisah gunakan saja.
|
Ungkapan ini((?<=[a-z0-9])[A-Z]|(?!^)[A-Z](?=[a-z]))
dapat menangani hampir setiap skenario di bukuItu semua tergantung pada apa yang Anda inginkan jadi gunakan solusi yang paling sesuai dengan kebutuhan Anda karena tidak boleh terlalu rumit.
nJoy!
sumber
(?!^)
ekspresi yang disebut melihat-belakang. Kecuali jika saya melewatkan sesuatu, yang benar-benar kita inginkan di sini adalah pandangan negatif yang harus diungkapkan(?<!^)
. Untuk alasan yang saya tidak bisa mengerti pandangan negatif Anda(?!^)
tampaknya bekerja juga ..."Camel2WARNING_Case_CASE"
menjadi"camel2_warning_case__case"
. Anda dapat menambahkan tampilan(?<!_)
negatif di belakang, untuk menyelesaikannya:re.sub('((?<=[a-z0-9])[A-Z]|(?!^)(?<!_)[A-Z](?=[a-z]))', r'_\1', "Camel2WARNING_Case_CASE").lower()
pengembalian'camel2_warning_case_case'
(?!^)
secara keliru disebut "lihat di belakang" dan seharusnya disebut pernyataan pencarian yang negatif . Seperti yang ditunjukkan penjelasan yang bagus ini , lookaheads negatif biasanya muncul setelah ekspresi yang Anda cari. Jadi Anda dapat menganggapnya(?!^)
sebagai "menemukan di''
mana<start of string>
tidak mengikuti". Memang, tampilan negatif di belakang juga berfungsi: Anda dapat menganggapnya(?<!^)
sebagai "menemukan di''
mana<start of string>
tidak mendahului".stringcase adalah perpustakaan pilihan saya untuk ini; misalnya:
sumber
Saya lebih suka menghindari
re
jika mungkin:sumber
re
perpustakaan dan melakukan hal-hal hanya dalam satu baris hanya menggunakan str.methods built-in! Ini mirip dengan jawaban ini , tetapi hindari menggunakan pengirisan dan tambahanif ... else
dengan hanya mengupas yang berpotensi ditambahkan "_" sebagai karakter pertama. Saya sangat suka ini.6.81 µs ± 22.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
tetapi untuk respons ini2.51 µs ± 25.5 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)
yang 2,5 kali lebih cepat! Suka ini!Secara pribadi saya tidak yakin bagaimana pun menggunakan ekspresi reguler dalam python dapat digambarkan sebagai elegan. Sebagian besar jawaban di sini hanya melakukan trik "kode golf" jenis RE. Pengkodean yang elegan seharusnya mudah dipahami.
sumber
+=
pada string hampir selalu merupakan ide yang buruk. Tambahkan ke daftar dan''.join()
pada akhirnya. Atau dalam hal ini, cukup bergabung dengan garis bawah ...sumber
Saya pikir solusi ini lebih mudah daripada jawaban sebelumnya:
Output yang mana:
Ekspresi reguler cocok dengan tiga pola:
[A-Z]?[a-z]+
: Huruf kecil berurutan yang secara opsional dimulai dengan huruf besar.[A-Z]{2,}(?=[A-Z][a-z]|\d|\W|$)
: Dua atau lebih huruf besar berturut-turut. Ini menggunakan lookahead untuk mengecualikan huruf besar terakhir jika diikuti oleh huruf kecil.\d+
: Nomor yang berurutan.Dengan menggunakan
re.findall
kita mendapatkan daftar "kata-kata" individual yang dapat dikonversi menjadi huruf kecil dan digabungkan dengan garis bawah.sumber
Saya tidak mengerti mengapa menggunakan keduanya .sub () panggilan? :) Saya bukan guru regex, tapi saya menyederhanakan fungsi yang satu ini, yang cocok untuk kebutuhan tertentu saya, saya hanya perlu solusi untuk mengkonversi camelCasedVars dari permintaan POST ke vars_with_underscore:
Itu tidak bekerja dengan nama-nama seperti getHTTPResponse, karena saya dengar itu penamaan yang buruk (harus seperti getHttpResponse, itu jelas, bahwa lebih mudah menghafal formulir ini).
sumber
'HTTPConnectionFactory'
, kode Anda menghasilkan'h_tt_pconnection_factory'
, kode dari jawaban yang diterima menghasilkan'http_connection_factory'
Inilah solusi saya:
Ini mendukung kasus sudut yang dibahas dalam komentar. Misalnya, itu akan dikonversi
getHTTPResponseCode
menjadiget_http_response_code
seperti seharusnya.sumber
Untuk bersenang-senang:
Atau, lebih untuk bersenang-senang:
sumber
str.join
telah usang sejak lama . Gunakan''.join(..)
sebagai gantinya.Menggunakan regex mungkin yang terpendek, tetapi solusi ini jauh lebih mudah dibaca:
sumber
Begitu banyak metode yang rumit ... Cukup temukan semua grup "Berjudul" dan gabungkan varian kase bawahnya dengan garis bawah.
Jika Anda tidak ingin membuat angka seperti karakter pertama grup atau grup terpisah - Anda dapat menggunakan
([A-z][a-z0-9]*)
mask.sumber
Tidak di perpustakaan standar, tetapi saya menemukan skrip ini yang tampaknya berisi fungsionalitas yang Anda butuhkan.
sumber
Ini bukan metode yang elegan, implementasi yang sangat 'rendah' dari mesin keadaan sederhana (mesin bitfield state), mungkin mode yang paling anti pythonic untuk menyelesaikan ini, namun modul ini juga menerapkan mesin keadaan terlalu rumit untuk menyelesaikan mesin sederhana ini. tugas, jadi saya pikir ini adalah solusi yang bagus.
splitsymbol dapat mem-parsing semua jenis kasus: UpperSEQUENCEDisatukan, under_score, BIG_SYMBOLS, dan cammelCasedMethods
Semoga bermanfaat
sumber
Diadaptasi secara ringan dari https://stackoverflow.com/users/267781/matth yang menggunakan generator.
sumber
Lihatlah Schibatics lib yang luar biasa
https://github.com/schematics/schematics
Hal ini memungkinkan Anda untuk membuat struktur data yang diketik yang dapat membuat cerita bersambung / deserialize dari python ke Javascript, misalnya:
sumber
Metode sederhana ini harus melakukan pekerjaan:
(diambil dari sini , lihat contoh kerja online )
sumber
Wow saya baru saja mencuri ini dari potongan Django. ref http://djangosnippets.org/snippets/585/
Cukup elegan
Contoh:
Pengembalian:
REGEX DEMO
sumber
Contoh menghebohkan menggunakan ekspresi reguler (Anda dapat dengan mudah membersihkan ini :)):
Bekerja untuk getHTTPResponseCode!
Atau, gunakan lambda:
EDIT: Seharusnya juga cukup mudah untuk melihat bahwa ada ruang untuk perbaikan untuk kasus-kasus seperti "Tes", karena garis bawah dimasukkan tanpa syarat.
sumber
Berikut adalah sesuatu yang saya lakukan untuk mengubah header pada file yang dibatasi-tab. Saya menghilangkan bagian di mana saya hanya mengedit baris pertama file. Anda dapat mengadaptasinya ke Python dengan cukup mudah dengan pustaka ulang. Ini juga termasuk memisahkan angka-angka (tetapi menjaga angka bersama-sama). Saya melakukannya dalam dua langkah karena itu lebih mudah daripada mengatakannya untuk tidak meletakkan garis bawah pada awal baris atau tab.
Langkah Satu ... cari huruf besar atau bilangan bulat didahului dengan huruf kecil, dan awali dengan garis bawah:
Cari:
Penggantian:
Langkah Dua ... ambil yang di atas dan jalankan lagi untuk mengonversi semua huruf besar menjadi huruf kecil:
Cari:
Penggantian (yaitu backslash, huruf kecil L, backslash, satu):
sumber
Saya mencari solusi untuk masalah yang sama, kecuali bahwa saya membutuhkan rantai; misalnya
Mulai dari solusi dua kata yang bagus di sini, saya datang dengan yang berikut:
Sebagian besar logika yang rumit adalah untuk menghindari mengurangi kata pertama. Ini versi yang lebih sederhana jika Anda tidak keberatan mengubah kata pertama:
Tentu saja, Anda dapat melakukan pre-kompilasi ekspresi reguler atau bergabung dengan garis bawah alih-alih tanda hubung, seperti yang dibahas dalam solusi lain.
sumber
Ringkas tanpa ekspresi reguler, tetapi HTTPResponseCode => httpresponse_code:
sumber
Tanpa perpustakaan apa pun:
Agak berat, tapi
sumber
RegEx yang sangat bagus diusulkan di situs ini :
Jika python memiliki metode String Split, itu harus berfungsi ...
Di Jawa:
sumber
Dan jika kita perlu membahas kasus dengan input yang sudah di-un-camel:
sumber
Untuk berjaga-jaga jika seseorang perlu mengubah file sumber yang lengkap, berikut adalah skrip yang akan melakukannya.
sumber
Saya cukup beruntung dengan yang ini:
Ini jelas bisa dioptimalkan untuk kecepatan kecil sedikit jika Anda ingin.
sumber
sumber
Menggunakan:
str.capitalize()
untuk mengkonversi huruf pertama dari string (terkandung dalam variabel str) ke huruf kapital dan mengembalikan seluruh string.Contoh: Perintah: "halo" .capitalize () Output: Halo
sumber