¿Cómo puedo reemplazar la primera aparición de un carácter en cada palabra?
Digamos que tengo esta cadena:
hello @jon i am @@here or @@@there and want some@thing in '@here"
# ^ ^^ ^^^ ^ ^
Y quiero eliminar el primero @
en cada palabra, para que termine teniendo una cadena final como esta:
hello jon i am @here or @@there and want something in 'here
# ^ ^ ^^ ^ ^
Solo para aclarar, los caracteres "@" siempre aparecen juntos en cada palabra, pero pueden estar al principio de la palabra o entre otros caracteres.
Logré eliminar el carácter "@" si aparece solo una vez usando una variación de la expresión regular que encontré en Eliminar subcadena cuando aparece una vez, pero no cuando dos veces seguidas en python , que usa una búsqueda anticipada negativa y una mirada negativa hacia atrás:
@(?!@)(?<!@@)
Ver la salida:
>>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here"
>>> re.sub(r'@(?!@)(?<!@@)', '', s)
"hello jon i am @@here or @@@there and want something in 'here"
Entonces, el siguiente paso es reemplazar la "@" cuando ocurre más de una vez. Esto es fácil s.replace('@@', '@')
al eliminar la "@" de donde sea que ocurra nuevamente.
Sin embargo, me pregunto: ¿hay alguna manera de hacer este reemplazo de una sola vez?
@Hello@There
dónde@
no sería consecutiva?Respuestas:
Haría un reemplazo de expresiones regulares en el siguiente patrón:
Y luego simplemente reemplace con el primer grupo de captura, que es todo @ símbolos continuos, menos uno.
Esto debería capturar todo lo que
@
ocurre al comienzo de cada palabra, ya sea esa palabra al comienzo, en el medio o al final de la cadena.Esto imprime:
fuente
¿Qué hay de usar
replace('@', '', 1)
en una expresión generadora?El valor int de
1
es elcount
argumento opcional .str.replace(old, new[, count])
fuente
replace(search, replace, max_matches)
, simplemente reemplaza el primero en cada palabra.count
, agregué la descripción de los documentos.Puedes usar
re.sub
así:Eso resultará en:
Y aquí hay una prueba de concepto:
fuente
Estaba reflexionando sobre los casos, y si solo el último carácter es
@
y no desea eliminarlo, o si tiene caracteres iniciales permitidos específicos, se le ocurrió esto:O bien, suponga que desea reemplazar
@
solo si está en los primeros n caracteresfuente
MANIFESTACIÓN
Puedes probar esto. Ver demo.
fuente
Salida:
fuente