2009-05-28 21 views

Respuesta

148

El tipo string no es compatible con esto. Probablemente sea mejor que use the regular expression sub method 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' 
+7

Si solo está haciendo una única sustitución, o quiere guardar líneas de código, es más eficiente usar una sola sustitución con re.sub y la bandera (? I): re.sub ('(? I) '+ re.escape ('hipopótamo'), 'jirafa', 'quiero un hIPpo para mi cumpleaños') –

+8

+1 para re.escape – daboross

+2

¿Por qué ** re.escape ** solo para una cadena de letras? Gracias. – Elena

61
import re 
pattern = re.compile("hello", re.IGNORECASE) 
pattern.sub("bye", "hello HeLLo HELLO") 
# 'bye bye bye' 
2

Esto no requiere RegularExp

def ireplace(old, new, text): 
    """ 
    Replace case insensitive 
    Raises ValueError if string not found 
    """ 
    index_l = text.lower().index(old.lower()) 
    return text[:index_l] + new + text[index_l + len(old):] 
+2

Bueno, sin embargo, esto no cambia todas las apariciones de antiguas a nuevas, sino solo la primera vez. – rsmoorthy

+3

Es menos legible que la versión regex. No hay necesidad de reinventar la rueda aquí. –

+0

Sería interesante hacer una comparación de rendimiento entre esta y las versiones upvoted, podría ser más rápido, lo cual es importante para algunas aplicaciones. O podría ser más lento porque hace más trabajo en Python interpretado. –

5

Continuando con la respuesta de bFloch, esta función va a cambiar no una, sino todas las apariciones de edad con nuevo - de una manera insensible caso.

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 
+0

Muy bien hecho. Mucho mejor que Regex; maneja todo tipo de caracteres, mientras que la expresión regular es muy exigente con cualquier cosa no alfanumérica. Respuesta preferida en mi humilde opinión. – fyngyrz

+0

Todo lo que tiene que hacer es escapar de la expresión regular: la respuesta aceptada es mucho más corta y más fácil de leer que esta. –

-1

nunca se registró una respuesta antes y este hilo es muy antiguo, pero se me ocurrió otra sollution y pensé que podría conseguir sus respons, Im no sazonado en la programación Python así que si hay inconvenientes appearant a ella, por favor apunte a cabo desde su buen aprendizaje :)

i='I want a hIPpo for my birthday' 
key='hippo' 
swp='giraffe' 

o=(i.lower().split(key)) 
c=0 
p=0 
for w in o: 
    o[c]=i[p:p+len(w)] 
    p=p+len(key+w) 
    c+=1 
print(swp.join(o)) 
+2

Para aprender: generalmente cuando haces una búsqueda y la reemplazas en una cadena, es mejor no tener que convertirla primero en una matriz. Es por eso que la primera respuesta es probablemente la mejor. Mientras usa un módulo externo, trata la cadena como una cadena completa. También está un poco más claro lo que está sucediendo en el proceso. – isaaclw

25

muy sencilla, 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 bien, utilizar las "banderas" opcionales argumento:

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' 
1

Me gusta Blair Conrad dice string.replace no es compatible con esto.

Utilice la expresión regular re.sub, pero recuerde primero escaparse de la cadena de reemplazo. Tenga en cuenta que no hay opción de distintivos en 2.6 para re.sub, por lo que tendrá que usar el modificador incorporado '(?i)' (o un objeto RE, consulte la respuesta de Blair Conrad). Además, otro inconveniente es que sub procesará escapes de barra invertida en el texto de reemplazo, si se da una cadena. Para evitar esto, uno puede pasar un lambda.

Así es una función:

import re 
def ireplace(old, repl, text): 
    return re.sub('(?i)'+re.escape(old), lambda m: repl, text) 

>>> ireplace('hippo?', 'giraffe!?', 'You want a hiPPO?') 
'You want a giraffe!?' 
>>> ireplace(r'[binfolder]', r'C:\Temp\bin', r'[BinFolder]\test.exe') 
'C:\\Temp\\bin\\test.exe' 
0

que estaba teniendo \ t ser convertido a la escape sequences (desplazarse un poco hacia abajo), por lo que tomó nota de que re.sub convertidos con barras invertidas caracteres de escape a secuencias de escape.

Para evitar que escribí lo siguiente:

Cambie entre mayúsculas y minúsculas.

import re 
    def ireplace(findtxt, replacetxt, data): 
     return replacetxt.join( re.compile(findtxt, flags=re.I).split(data) ) 

También, si lo desea para reemplazar a los caracteres de escape, al igual que las otras respuestas aquí que están recibiendo los caracteres especiales bashslash significado convierten en secuencias de escape, simplemente descifrar su hallazgo y, o reemplazar cadena. En Python 3, podría tener que hacer algo como .decode ("unicode_escape") # python3

findtxt = findtxt.decode('string_escape') # python2 
replacetxt = replacetxt.decode('string_escape') # python2 
data = ireplace(findtxt, replacetxt, data) 

Probado en Python 2.7.8

Espero que ayude.

Cuestiones relacionadas