¿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 la primera @ en cada palabra, para terminar teniendo una cadena final como esta:
hello jon i am @here or @@there and want something in 'here # ^ ^ ^^ ^ ^Solo como aclaración, los caracteres "@" siempre aparecen juntos en cada palabra, pero pueden estar al principio de la palabra o entre otros caracteres.
Me las arreglé para 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 ocurre dos veces seguidas en python , que usa una mirada hacia adelante negativa y una mirada atrás negativa:
@(?!@)(?<!@@)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 aparece más de una vez. Esto es fácil haciendo s.replace('@@', '@') para eliminar la "@" de donde sea que aparezca nuevamente.
Sin embargo, me pregunto: ¿hay alguna manera de hacer este reemplazo de una sola vez?
¿Qué tal usar replace('@', '', 1) en una expresión de generador?
string = 'hello @jon i am @@here or @@@there and want some@thing in "@here"' result = ' '.join(s.replace('@', '', 1) for s in string.split(' ')) # output: hello jon i am @here or @@there and want something in "here" El valor int de 1 es el argumento de count opcional.
str.replace(old, new[, count])
Devuelve una copia de la cadena con todas las apariciones de la subcadena antigua reemplazada por nueva . Si se proporciona el argumento opcional recuento , solo se reemplazan las primeras ocurrencias de recuento .
Haría un reemplazo de expresiones regulares en el siguiente patrón:
@(@*)Y luego simplemente reemplace con el primer grupo de captura, que son todos los símbolos @ continuos, menos uno.
Esto debería capturar cada @ que aparece al comienzo de cada palabra, ya sea esa palabra al principio, en el medio o al final de la cadena.
inp = "hello @jon i am @@here or @@@there and want some@thing in '@here" out = re.sub(r"@(@*)", '\\1', inp) print(out)Esto imprime:
hello jon i am @here or @@there and want something in 'hereEstaba reflexionando para los casos, qué pasa si solo el último carácter es @ y no desea eliminarlo, o si tiene caracteres de inicio permitidos específicos, se le ocurrió esto:
>>> ' '.join([s_.replace('@', '', 1) if s_[0] in ["'", "@"] else s_ for s_ in s.split()]) "hello jon i am @here or @@there and want some@thing in 'here" O suponga que desea reemplazar @ solo si está en los primeros n caracteres
>>> ' '.join([s_.replace('@', '', 1) if s_.find('@') in range(2) else s_ for s_ in s.split()]) "hello jon i am @here or @@there and want some@thing in 'here"Puedes usar re.sub así:
import re s = "hello @jon i am @@here or @@@there and want some@thing in '@here" s = re.sub('@(\w)', r'\1', s) print(s)Eso dará como resultado:
"hello jon i am @here or @@there and want something in 'here"Y aquí hay una prueba de concepto:
>>> import re >>> s = "hello @jon i am @@here or @@@there and want some@thing in '@here" >>> re.sub('@(\w)', r'\1', s) "hello jon i am @here or @@there and want something in 'here" >>># Python3 program to remove the @ from String def ExceptAtTheRate(string): # Split the String based on the space arrOfStr = string.split() # String to store the resultant String res = "" # Traverse the words and # remove the first @ From every word. for a in arrOfStr: if(a[0]=='@'): res += a[1:len(a)] + " " else: res += a[0:len(a)] + " " return res # Driver code string = "hello @jon i am @@here or @@@there and want some@thing in '@here" print(ExceptAtTheRate(string))Producción: