Apa cara termudah untuk melakukan penggantian string case-insensitive dengan Python?
python
string
case-insensitive
Adam Ernst
sumber
sumber
'hippo'
, tetapi akan berguna jika nilai to-replace dimasukkan ke fungsi, jadi ini benar-benar lebih dari contoh yang baik daripada yang lainnya.re.escape
, ada jebakan lain di sini yang gagal dihindari jawaban ini, yang dicatat di stackoverflow.com/a/15831118/1709587 : sejakre.sub
proses melarikan diri dari urutan, seperti dicatat dalam docs.python.org/library/re.html#re .sub , Anda harus melarikan diri semua backslash dalam string pengganti Anda atau menggunakan lambda.sumber
re.sub('hello', 'bye', 'hello HeLLo HELLO', flags=re.IGNORECASE)
re.sub
hanya mendukung flag ini sejak Python 2.7.Dalam satu baris:
Atau, gunakan argumen "bendera" opsional:
sumber
Melanjutkan jawaban bFloch, fungsi ini tidak akan berubah satu, tetapi semua kejadian lama dengan yang baru - dalam kasus yang tidak sensitif.
sumber
Seperti kata Blair Conrad string.replace tidak mendukung ini.
Gunakan regex
re.sub
, tapi ingat untuk melarikan diri dari string pengganti terlebih dahulu. Perhatikan bahwa tidak ada opsi-flag di 2.6 untukre.sub
, jadi Anda harus menggunakan pengubah tertanam'(?i)'
(atau objek-RE, lihat jawaban Blair Conrad). Juga, jebakan lain adalah bahwa sub akan memproses backslash lolos dalam teks pengganti, jika string diberikan. Untuk menghindari yang satu ini, Anda bisa memasukkan lambda.Inilah fungsinya:
sumber
Fungsi ini menggunakan fungsi
str.replace()
danre.findall()
. Ini akan menggantikan semua kejadianpattern
instring
denganrepl
cara case-insensitive.sumber
Ini tidak memerlukan RegularExp
sumber
Pengamatan menarik tentang detail dan opsi sintaks:
Python 3.7.2 (tag / v3.7.2: 9a3ffc0492, 23 Desember 2018, 23:09:28) [MSC v.1916 64 bit (AMD64)] di win32
'akar rumput akar rumput'
'TREEROOT akar rumput TREerOot'
'akar rumput akar rumput'
'TREEROOT akar rumput TREerOot'
Jadi awalan (? I) dalam ekspresi kecocokan atau menambahkan "flags = re.I" sebagai argumen keempat akan menghasilkan kecocokan case-insensitive. TETAPI, hanya menggunakan "re.I" sebagai argumen keempat tidak menghasilkan kecocokan case-sensitive.
Untuk perbandingan,
['TREEROOT', 'treeroot', 'TREerOot']
['akar pohon']
sumber
Saya sedang dikonversi ke urutan escape (gulir sedikit ke bawah), jadi saya mencatat bahwa re.sub mengkonversi karakter melarikan diri backslashed untuk melarikan diri dari urutan.
Untuk mencegahnya saya menulis yang berikut ini:
Ganti case sensitif.
Juga, jika Anda ingin mengganti dengan karakter escape, seperti jawaban lain di sini yang mendapatkan makna khusus karakter bashslash dikonversi untuk keluar dari urutan, cukup decode pencarian Anda dan, atau ganti string. Dalam Python 3, mungkin harus melakukan sesuatu seperti .decode ("unicode_escape") # python3
Diuji dalam Python 2.7.8
Semoga itu bisa membantu.
sumber
tidak pernah memposting jawaban sebelumnya dan utas ini benar-benar tua tetapi saya datang dengan solusi lain dan mengira saya bisa mendapatkan respons Anda, saya tidak berpengalaman dalam pemrograman Python jadi jika ada kelemahan yang muncul untuk itu, harap tunjukkan karena pembelajaran yang baik: )
sumber