2012-06-19 13 views
10

Aquí está mi problema: en una variable que es texto y contiene comas, intento eliminar solo las comas ubicadas entre dos cadenas (de hecho [ y ]). Por ejemplo, usando la siguiente cadena:Reemplazar una cadena ubicada entre

input = "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better." 
output = "The sun shines, that's fine [not for everyone] and if it rains, it Will Be better." 

sé cómo utilizar .replace para toda la variable, pero no puedo hacerlo por una parte de ella. Hay algunos temas que se aproximan en este sitio, pero no lograron explotarlos para mi propia pregunta, por ejemplo:

+0

resultado esperado? –

Respuesta

15
import re 
Variable = "The sun shines, that's fine [not, for, everyone] and if it rains, it Will Be better." 
Variable1 = re.sub("\[[^]]*\]", lambda x:x.group(0).replace(',',''), Variable) 

En primer lugar es necesario encontrar las partes de la cadena que necesita ser reescrito (hacer esto con re.sub). Luego reescribes esas partes.

La función var1 = re.sub("re", fun, var) significa: encuentre todas las subcadenas en la variable var que corresponden a re; procesarlos con la función fun; devolver el resultado; el resultado se guardará en la variable var1.

La expresión regular "[[^]] *]" significa: buscar subcadenas que empiezan con [ (\[ in re), contienen todo excepto ] ([^]]* in re) y terminar con ] (\] in re).

Para cada ocurrencia encontrada, ejecute una función que convierta esta ocurrencia a algo nuevo. La función es:

lambda x: group(0).replace(',', '') 

Eso significa: tomar la cadena que se encontró (group(0)), reemplace ',' con '' (quitar , en otras palabras) y devolver el resultado.

+0

¡Muchas gracias funcionó! ¡Y gracias por la explicación! – user1453786

+0

@ user1453786: con todo respeto, la respuesta de @Qtax es mucho mejor. El 'sub' funcional es una técnica útil para saber, pero en este caso es claramente excesivo. – georg

+0

@ thg435: No, no lo es. Porque no funcionará, por ejemplo, para los soportes desequilibrados. Qtax verifica con la afirmación de anticipación solo terminar parte de la expresión y eso es incorrecto. Por favor intente con "no, para todos" y si llueve, lo hará [a, c], "' y lo verá usted mismo. Por supuesto, también se puede agregar la aseveración "mirar hacia atrás", pero eso ya no será tan simple –

2

puede utilizar un expresión como esta para que coincida con ellos (si los corchetes están equilibrados):

,(?=[^][]*\]) 

algo que se usa como:

re.sub(r",(?=[^][]*\])", "", str) 
+0

Me gusta su respuesta, es muy clara y efectiva, pero creo que tiene una desventaja. Creo que eso no funcionará para los soportes desequilibrados. Verifica solo la parte final de la expresión. Sería realmente genial resolver esta tarea con las afirmaciones de mirar hacia adelante/mirar hacia atrás, pero no estoy seguro de que sea tan elegante como ahora. –

-2

Si no le gusta aprender expresiones regulares (vea otras respuestas en esta página), puede usar el comando de partición.

sentence = "the quick, brown [fox, jumped , over] the lazy dog" 
left, bracket, rest = sentence.partition("[") 
block, bracket, right = rest.partition("]") 

"bloque" es ahora la parte de la cadena entre los corchetes, "izquierda" es lo que estaba a la izquierda del paréntesis de apertura y "derecha" es lo que estaba a la derecha del corchete de apertura.

entonces usted puede recuperar la frase completa con:

new_sentence = left + "[" + block.replace(",","") + "]" + right 
print new_sentence # the quick, brown [fox jumped over] the lazy dog 

Si usted tiene más de un bloque, se puede poner todo esto en un bucle, aplicando el comando de partición de "derecho" a cada paso.

¡O podrías aprender expresiones regulares! Valdrá la pena en el largo plazo.

+0

Este método no funcionará cuando haya más de una sección "especial" en la cadena (por ejemplo: '" a, b [c, d] e , f [g, e] h, i "') –

+0

No llame a las variables 'string'; confundirá a los desarrolladores que esperan que sea el ['string' module] (http://docs.python.org/library/string.html) de python stdlib. –

+0

Además, ¿por qué no utilizar '.split ('[', 1)' aquí, de todos modos está lanzando los corchetes. Y la segunda llamada '.partition' debe estar en' rest', no en 'string', por lo que este código no funcionará en absoluto. 'cadena' termina como' "el rápido, marrón [el marrón rápido [el zorro saltó] el perro perezoso" '. –

0

Aquí hay un método no regex. Puede reemplazar sus delimitadores [] con decir [/ y /], y luego split en el delimitador /. Entonces, cada odd cadena de la lista dividida necesita ser procesada para comma extracción, lo que se puede hacer mientras se reconstruye la cadena en una lista por comprensión:

>>> Variable = "The sun shines, that's fine [not, for, everyone] and if it rains, 
       it Will Be better." 
>>> chunks = Variable.replace('[','[/').replace(']','/]').split('/') 
>>> ''.join(sen.replace(',','') if i%2 else sen for i, sen in enumerate(chunks)) 
"The sun shines, that's fine [not for everyone] and if it rains, it Will Be 
better." 
+0

Gracias, probaré este también. – user1453786

Cuestiones relacionadas