Reemplazo que no distingue entre mayúsculas y minúsculas

Resuelto Adam Ernst asked hace 15 años • 11 respuestas

¿Cuál es la forma más sencilla de realizar un reemplazo de cadena que no distingue entre mayúsculas y minúsculas en Python?

Adam Ernst avatar May 28 '09 10:05 Adam Ernst
Aceptado

El stringtipo no admite esto. Probablemente sea mejor utilizar el submétodo de expresión regular con la opción re.IGNORECASE .

>>> import re
>>> insensitive_hippo = re.compile(re.escape('hippo'), re.IGNORECASE)
>>> insensitive_hippo.sub('giraffe', 'I want a hIPpo for my birthday')
'I want a giraffe for my birthday'
Blair Conrad avatar May 28 '2009 03:05 Blair Conrad
import re
pattern = re.compile("hello", re.IGNORECASE)
pattern.sub("bye", "hello HeLLo HELLO")
# 'bye bye bye'
Unknown avatar May 28 '2009 03:05 Unknown

En una sola línea:

import re
re.sub("(?i)hello","bye", "hello HeLLo HELLO") #'bye bye bye'
re.sub("(?i)he\.llo","bye", "he.llo He.LLo HE.LLO") #'bye bye bye'

O utilice el argumento opcional "banderas":

import re
re.sub("hello", "bye", "hello HeLLo HELLO", flags=re.I) #'bye bye bye'
re.sub("he\.llo", "bye", "he.llo He.LLo HE.LLO", flags=re.I) #'bye bye bye'
viebel avatar Mar 14 '2012 20:03 viebel

Continuando con la respuesta de bFloch, esta función cambiará no una, sino todas las apariciones de lo antiguo con lo nuevo, sin distinguir entre mayúsculas y minúsculas.

def ireplace(old, new, text):
    idx = 0
    while idx < len(text):
        index_l = text.lower().find(old.lower(), idx)
        if index_l == -1:
            return text
        text = text[:index_l] + new + text[index_l + len(old):]
        idx = index_l + len(new) 
    return text
rsmoorthy avatar Jan 23 '2011 11:01 rsmoorthy