Quel est le moyen le plus simple de remplacer une chaîne insensible à la casse en Python?
python
string
case-insensitive
Adam Ernst
la source
la source
'hippo'
, mais serait utile si la valeur à remplacer était passée dans une fonction, donc c'est vraiment plus un bon exemple qu'autre chose.re.escape
votre aiguille, il y a un autre piège ici que cette réponse ne parvient pas à éviter, noté dans stackoverflow.com/a/15831118/1709587 : puisquere.sub
traite les séquences d'échappement, comme indiqué dans docs.python.org/library/re.html#re .sub , vous devez soit échapper toutes les barres obliques inverses dans votre chaîne de remplacement, soit utiliser un lambda.la source
re.sub('hello', 'bye', 'hello HeLLo HELLO', flags=re.IGNORECASE)
re.sub
ne prend en charge cet indicateur que depuis Python 2.7.En une seule ligne:
Ou, utilisez l'argument optionnel "flags":
la source
Poursuivant sur la réponse de bFloch, cette fonction ne changera pas une, mais toutes les occurrences d'ancien avec nouveau - sans tenir compte de la casse.
la source
Comme Blair Conrad dit que string.replace ne prend pas en charge cela.
Utilisez l'expression régulière
re.sub
, mais n'oubliez pas d'échapper d'abord à la chaîne de remplacement. Notez qu'il n'y a pas d'option flags dans la version 2.6 pourre.sub
, vous devrez donc utiliser le modificateur intégré'(?i)'
(ou un objet RE, voir la réponse de Blair Conrad). De plus, un autre piège est que sub traitera les échappements de barre oblique inverse dans le texte de remplacement, si une chaîne est donnée. Pour éviter cela, on peut à la place passer dans un lambda.Voici une fonction:
la source
Cette fonction utilise à la fois les fonctions
str.replace()
etre.findall()
. Il remplacera toutes les occurrences depattern
instring
parrepl
d'une manière insensible à la casse.la source
Cela ne nécessite pas RegularExp
la source
Une observation intéressante sur les détails de la syntaxe et les options:
Python 3.7.2 (tags / v3.7.2: 9a3ffc0492, 23 décembre 2018, 23:09:28) [MSC v.1916 64 bits (AMD64)] sur win32
`` à la base à la base à la base ''
'TREEROOT grassroot TREerOot'
`` à la base à la base à la base ''
'TREEROOT grassroot TREerOot'
Ainsi, le préfixe (? I) dans l'expression de correspondance ou l'ajout de "flags = re.I" comme quatrième argument entraînera une correspondance insensible à la casse. MAIS, utiliser simplement "re.I" comme quatrième argument ne donne pas de correspondance insensible à la casse.
En comparaison,
['TREEROOT', 'treeroot', 'TREerOot']
['racine d'arbre']
la source
Je n'avais pas été converti en séquences d'échappement ( faites défiler un peu vers le bas), alors j'ai noté que re.sub convertit les caractères échappés antislashés en séquences d'échappement.
Pour éviter cela, j'ai écrit ce qui suit:
Remplacez insensible à la casse.
De plus, si vous voulez qu'il soit remplacé par les caractères d'échappement, comme les autres réponses ici qui obtiennent les caractères bashslash de signification spéciale convertis en séquences d'échappement, décodez simplement votre recherche et, ou remplacez la chaîne. Dans Python 3, vous devrez peut-être faire quelque chose comme .decode ("unicode_escape") # python3
Testé en Python 2.7.8
J'espère que cela pourra aider.
la source
Je n'ai jamais posté de réponse auparavant et ce fil est vraiment vieux mais j'ai trouvé une autre solution et j'ai pensé que je pourrais obtenir votre réponse, je ne suis pas expérimenté en programmation Python, donc s'il y a des inconvénients apparents, veuillez les signaler depuis son bon apprentissage: )
la source