¿Cuál es la forma más fácil de hacer un reemplazo de cadenas insensible a mayúsculas y minúsculas en Python?Reemplazo insensible a mayúsculas
Respuesta
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'
import re
pattern = re.compile("hello", re.IGNORECASE)
pattern.sub("bye", "hello HeLLo HELLO")
# 'bye bye bye'
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):]
Bueno, sin embargo, esto no cambia todas las apariciones de antiguas a nuevas, sino solo la primera vez. – rsmoorthy
Es menos legible que la versión regex. No hay necesidad de reinventar la rueda aquí. –
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. –
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
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
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. –
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))
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
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'
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'
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.
- 1. Insensible a mayúsculas/minúsculas #define
- 2. Una lista insensible a mayúsculas y minúsculas
- 3. Búsqueda insensible a mayúsculas/minúsculas usando Hibernate
- 4. KVC insensible a mayúsculas/minúsculas en Cocoa?
- 5. Emparejamiento de Rspec insensible a mayúsculas
- 6. JavaScript: búsqueda insensible a mayúsculas/minúsculas
- 7. Cadena insensible a mayúsculas y minúsculas :: find
- 8. Insensible a mayúsculas/minúsculas reemplace todo
- 9. Búsqueda de lista insensible a mayúsculas/minúsculas
- 10. LINQ contiene insensible a mayúsculas y minúsculas
- 11. Comparación NSString insensible a las mayúsculas
- 12. Diccionario insensible a mayúsculas/minúsculas no funciona
- 13. Insensible a mayúsculas ¿REEMPLAZAR en MySQL?
- 14. SOLR Búsqueda insensible a mayúsculas/minúsculas
- 15. Reemplazo insensible a mayúsculas y minúsculas sin usar expresión regular en C#?
- 16. Linq a Sql distinción insensible a mayúsculas y minúsculas
- 17. Clasificación insensible a mayúsculas/minúsculas con Google Guava
- 18. Búsqueda insensible a mayúsculas y minúsculas con $ en
- 19. Arreglo insensible a mayúsculas y minúsculas en Lua
- 20. Cadena KeyedCollection Insensible a las mayúsculas y minúsculas
- 21. Regex insensible a mayúsculas y minúsculas en javascript
- 22. búsqueda insensible a mayúsculas y minúsculas de MySQL?
- 23. Variable insensible a mayúsculas/minúsculas para String replaceTodo (,) método Java
- 24. Versión de PHP insensible a mayúsculas/minúsculas de file_exists()
- 25. Findall insensible a mayúsculas y minúsculas en Python ElementTree
- 26. Sustitución de cadenas insensible a mayúsculas y minúsculas en JavaScript?
- 27. ¿Búsqueda del diccionario insensible a mayúsculas y minúsculas?
- 28. Analizador-analizador Scala insensible a las mayúsculas y minúsculas
- 29. Globo insensible a mayúsculas y minúsculas en zsh/bash
- 30. ordenación de lista insensible a mayúsculas y minúsculas, sin minúsculas?
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') –
+1 para re.escape – daboross
¿Por qué ** re.escape ** solo para una cadena de letras? Gracias. – Elena