En Python, ¿cómo reemplazo una cadena en el texto sin reemplazar las subcadenas?

Todas las respuestas que sugieren agregar espacios antes y después de la palabra que está reemplazando son incorrectas . Aquí hay un contraejemplo:

>>> 'this is is a is string'.replace(' is ',' xx ')
'this xx is a xx string'

¿Ves el 'is' todavía en la cadena? ¿Qué está haciendo allí, por qué no fue reemplazado? Bueno, el problema es que el espacio inmediatamente anterior a 'is' ya se ha procesado como parte de la coincidencia anterior de ' is ' .

Para solucionar este problema, simplemente necesita llamar a reemplazar dos veces seguidas . (¿Ves por qué es suficiente, independientemente de la cantidad de apariciones de la palabra que estamos reemplazando?)

(Por supuesto, la solución basada en expresiones regulares con marcas de límite de palabras casi siempre será la mejor manera de hacer esto en la práctica. Es concisa y legible, sin casos difíciles como el que mencioné anteriormente).

Solo incluya espacios antes y después de ambas cadenas involucradas en el reemplazo.
tekst1 = tekst.replace_all(' is ', ' je ')

Hay un módulo re Python, para tratar con expresiones regulares [funciona con versiones 2.xy 3.x], pero me parece un poco excesivo para este problema.

Gracias por a2a.

Oye, puedes usar el límite de palabra “\ b” en la subfunción regex.

importar re
x = “Inicio es deshabilitar isis en won”
print (re.sub (r “\ bis \ b”, “je”, x))

Ideone-OP

No estoy seguro de cuál es el caso de uso aquí, pero la respuesta de Giacomo Sorbi solo funcionará para los casos en que ‘es’ no sea la palabra inicial o final en la cadena. Tampoco conservará el caso si ‘Is’ es la primera palabra en una oración.

Hacer esto con una expresión regular debería ser muy sencillo:

import re

string_list = [‘esto es una cadena’,
‘¿es esto una cuerda?’,
dime qué es una cuerda. ¿Es este?’]

# minúscula con límite de palabra
minúscula = re.compile (r ‘\ bis \ b’)
#uppercase con límite de palabra
mayúscula = re.compile (r ‘\ bIs \ b’)

convert_replace = map (lambda x: x.replace (‘is’, ‘je’), string_list)

# ejecutarlo dos veces para captar tanto mayúsculas como minúsculas
convertido_regex = mapa (lambda x: minúscula.sub (‘je’, x), string_list)
convertido_regex = mapa (lambda x: uppercase.sub (‘Je’, x), convertido_regex)

print (‘Usando replace:’, list (convert_replace))
print (‘Usando regex:’, list (convertido_regex))

Salida:
Usando replace: [‘this je a string’, ‘is this a string?’, ‘Dime qué es una cadena. ¿Es este?’]
Usando regex: [‘this je a string’, ‘je this a string?’, ‘Dime qué cadena je. Je este? ‘]

Aprender más sobre expresiones regulares le ahorrará un montón de tiempo con este tipo de problemas y vale la pena cualquier esfuerzo a corto plazo. ¡Buena suerte!

Regex es un martillo bastante grande. Por supuesto, debe saber cómo usar ese martillo si realmente necesita un martillo grande, pero sin embargo es un martillo. Y sabes lo que dicen sobre los martillos: si todo lo que tienes es un martillo, todo parece un clavo. A Jamie Zawinsky se le atribuye la frase

Algunas personas, cuando se enfrentan a un problema, piensan “Lo sé, usaré expresiones regulares”. Ahora ellos tienen dos problemas.

El uso de expresiones regulares es problemático porque puede terminar rápidamente con algo que puede funcionar, pero en una semana o mes perdió la intuición de la expresión, incapaz de decir qué está haciendo esto sin sumergirse nuevamente en sus complejidades.

El Zen de Python dice “Debería haber una, y preferiblemente solo una, forma obvia de hacerlo”.
En este caso, esta única forma * debería * ser str.replace () pero, como Michal señaló correctamente, no funcionará sin problemas. Sin embargo, hay una manera obvia de hacer este tipo de trabajo correctamente: dividir el texto en palabras y manejar cada palabra por separado.

El enfoque más simple para hacerlo es:

desde shlex import split
s = ‘esta es una cadena es’
“” .join (“xx” si x == “es” else x para x en divisiones)

str.split () es un poco contundente. Prefiero shlex.split para tales fines, pero perderá la mayor parte de la puntuación en el proceso, que puede o no ser lo que desea.

Si * realmente * desea comenzar a procesar el lenguaje natural, debe usar el Kit de herramientas de lenguaje natural. Esto proporciona nltk.word_tokenize () como una mejor manera de dividir cadenas, que se explica en nltk-book: Procesando texto sin formato.

Seguramente hay: ¿sabes algo sobre expresiones regulares en Python?

Eso podría ayudarlo MUCHO incluso en desafíos mucho más difíciles; de lo contrario simplemente iría con esta línea:

tekst1 = tekst.replace_all(' is ',' je ')
Simple, pero bastante efectivo 🙂

Espero que esto ayude, avíseme si necesita más soporte, posiblemente incluyendo un uso más avanzado de reemplazo (con expresiones regulares, de hecho) para tareas más específicas.

Feliz codificación 🙂

La forma más fácil es encontrar “es”, verifique los caracteres a cada lado. Si no son una letra o son un final de la cadena, reemplácelos.