2011-07-14 11 views
7

tengo una expresión regular como esto:Sustitución de cada partido con una palabra diferente

findthe = re.compile(r" the ") 
replacement = ["firstthe", "secondthe"] 
sentence = "This is the first sentence in the whole universe!" 

Lo que estoy tratando de hacer es sustituir cada ocurrencia con una palabra de sustitución asociado de una lista para que la oración final sería tener este aspecto:

>>> print sentence 
This is firstthe first sentence in secondthe whole universe 

he intentado utilizar re.sub dentro de un bucle for enumerando sobre el reemplazo pero parece re.sub devuelve todas las ocurrencias. ¿Puede alguien decirme cómo hacer esto de manera eficiente?

Respuesta

6

Si no se requiere el uso de expresiones regulares que se puede tratar de utilizar el siguiente código:

replacement = ["firstthe", "secondthe"] 
sentence = "This is the first sentence in the whole universe!" 

words = sentence.split() 

counter = 0 
for i,word in enumerate(words): 
    if word == 'the': 
     words[i] = replacement[counter] 
     counter += 1 

sentence = ' '.join(words) 

O algo como esto también funcionará:

import re 
findthe = re.compile(r"\b(the)\b") 
print re.sub(findthe, replacement[1],re.sub(findthe, replacement[0],sentence, 1), 1) 

Y por lo menos:

re.sub(findthe, lambda matchObj: replacement.pop(0),sentence) 
+0

Desafortunadamente, la lógica de reemplazo es un poco más compleja para mí. Lo que he proporcionado es un caso de prueba. En mi caso, podría haber 10-20 'the''s. Todavía se puede hacer utilizando su método, pero estoy buscando un enfoque más conciso. Pero +1 por tu ayuda. – Legend

+0

Gracias, marque la última solución. –

+0

¡Simplemente increíble! Gracias de nuevo por tu tiempo. – Legend

2

Usted puede utilizar una función de devolución de llamada como parámetro de sustitución, ver cómo en:

http://docs.python.org/library/re.html#re.sub

A continuación, utilice algún mostrador y reemplazar dependiendo del valor del contador.

+0

Gracias. Jugaré con eso ahora y volveré. – Legend

4

La última respuesta de Artsiom es destructiva de replacement variable. Aquí hay una manera de hacerlo sin vaciar replacement

re.sub(findthe, lambda m, r=iter(replacement): next(r), sentence) 
+0

+1 para este enfoque también. Gracias. – Legend

Cuestiones relacionadas