Jaki jest najłatwiejszy sposób na zastąpienie ciągu znaków bez uwzględniania wielkości liter w Pythonie?
python
string
case-insensitive
Adam Ernst
źródło
źródło
'hippo'
, ale byłoby przydatne, gdyby wartość do zastąpienia została przekazana do funkcji, więc jest to naprawdę dobry przykład niż cokolwiek innego.re.escape
igły jest tu jeszcze jedna pułapka, której ta odpowiedź nie pozwala uniknąć, odnotowana na stackoverflow.com/a/15831118/1709587 : ponieważre.sub
sekwencje ucieczki procesów, jak wspomniano w docs.python.org/library/re.html#re .sub , musisz albo usunąć wszystkie ukośniki odwrotne w twoim ciągu zastępującym, albo użyć lambda.źródło
re.sub('hello', 'bye', 'hello HeLLo HELLO', flags=re.IGNORECASE)
re.sub
obsługuje tę flagę tylko od wersji Python 2.7.W jednej linii:
Lub użyj opcjonalnego argumentu „flagi”:
źródło
Kontynuując odpowiedź bFlocha, funkcja ta zmieni nie jedno, ale wszystkie wystąpienia stare na nowe - w sposób niewrażliwy na wielkość liter.
źródło
Jak mówi Blair Conrad, string.replace tego nie obsługuje.
Użyj wyrażenia regularnego
re.sub
, ale pamiętaj, aby najpierw uciec przed ciągiem zastępującym. Zauważ, że w 2.6 nie ma opcji flagi dlare.sub
, więc będziesz musiał użyć wbudowanego modyfikatora'(?i)'
(lub obiektu RE, zobacz odpowiedź Blaira Conrada). Kolejną pułapką jest to, że sub będzie przetwarzać znaki z ukośnikiem odwrotnym w tekście zastępującym, jeśli podany zostanie ciąg. Aby tego uniknąć, można zamiast tego podać lambdę.Oto funkcja:
źródło
Ta funkcja korzysta zarówno z funkcji, jak
str.replace()
ire.findall()
. Będzie ona zastąpić wszystkich wystąpieńpattern
wstring
zerepl
w przypadku niewrażliwe sposób.źródło
To nie wymaga RegularExp
źródło
Interesująca obserwacja dotycząca szczegółów składni i opcji:
Python 3.7.2 (tags / v3.7.2: 9a3ffc0492, 23 grudnia 2018 r., 23:09:28) [MSC v.1916 64-bitowy (AMD64)] na win32
„oddolny oddolny”
„TREEROOT Grassroot TREerOot”
„oddolny oddolny”
„TREEROOT Grassroot TREerOot”
Tak więc prefiks (? I) w wyrażeniu dopasowującym lub dodanie „flags = re.I” jako czwartego argumentu spowoduje dopasowanie bez rozróżniania wielkości liter. ALE użycie samego „re.I” jako czwartego argumentu nie powoduje dopasowania bez rozróżniania wielkości liter.
Dla porownania,
[„TREEROOT”, „treeroot”, „TREerOot”]
['korzeń drzewa']
źródło
Miałem \ t być konwertowane na sekwencje specjalne (przewiń trochę w dół), więc zauważyłem, że funkcja re.sub konwertuje znaki ucieczki odwrócone ukośnikiem na sekwencje ucieczki.
Aby temu zapobiec, napisałem:
Zastąp bez rozróżniania wielkości liter.
Ponadto, jeśli chcesz, aby zastąpiono go znakami ucieczki, tak jak inne odpowiedzi tutaj, które otrzymują specjalne znaczenie znaków bashslash konwertowanych na sekwencje ucieczki, po prostu zdekoduj znalezione i lub zamień ciąg. W Pythonie 3 może być konieczne wykonanie czegoś takiego jak .decode ("unicode_escape") # python3
Przetestowano w Pythonie 2.7.8
Mam nadzieję, że to pomoże.
źródło
nigdy wcześniej nie publikowałem odpowiedzi, a ten wątek jest naprawdę stary, ale wymyśliłem inne rozwiązanie i pomyślałem, że mogę uzyskać twoją odpowiedź.Nie jestem doświadczony w programowaniu w Pythonie, więc jeśli są w nim widoczne wady, wskaż je, ponieważ dobrze się uczy: )
źródło