reemplazar elemento en una cadena si coincide con un elemento en la lista

Estoy tratando de eliminar palabras de una cadena si coinciden con una lista.

x = "How I Met Your Mother 7x17 (HDTV-LOL) [VTV] - Mon, 20 Feb 2012" tags = ['HDTV', 'LOL', 'VTV', 'x264', 'DIMENSION', 'XviD', '720P', 'IMMERSE'] print x for tag in tags: if tag in x: print x.replace(tag, '') 

Produce esta salida:

 How I Met Your Mother 7x17 (HDTV-LOL) [VTV] - Mon, 20 Feb 2012 How I Met Your Mother 7x17 (-LOL) [VTV] - Mon, 20 Feb 2012 How I Met Your Mother 7x17 (HDTV-) [VTV] - Mon, 20 Feb 2012 How I Met Your Mother 7x17 (HDTV-LOL) [] - Mon, 20 Feb 2012 

Quiero que elimine todas las palabras que coincidan con la lista.

No estás manteniendo el resultado de x.replace() . Intente lo siguiente en su lugar:

 for tag in tags: x = x.replace(tag, '') print x 

Tenga en cuenta que su enfoque coincide con cualquier subcadena, y no solo con palabras completas. Por ejemplo, eliminaría el LOL en RUN LOLA RUN .

Una forma de abordar esto sería encerrar cada etiqueta en un par de cadenas r'\b' , y buscar la expresión regular resultante. La r'\b' solo coincidiría en los límites de las palabras:

 for tag in tags: x = re.sub(r'\b' + tag + r'\b', '', x) 

El método str.replace() no cambia la cadena en su lugar, las cadenas son inmutables en Python. Debe vincular x a la nueva cadena devuelta por replace() en cada iteración:

 for tag in tags: x = x.replace(tag, "") 

Tenga en cuenta que la sentencia if es redundante; str.replace() no hará nada si no encuentra una coincidencia.

Usando las tags tus variables y x , puedes usar esto:

 output = reduce(lambda a,b: a.replace(b, ''), tags, x) 

devoluciones:

 'How I Met Your Mother 7x17 (-) [] - Mon, 20 Feb 2012' 

(1) x.replace(tag, '') no modifica x , sino que devuelve una nueva cadena con el reemplazo.

(2) ¿por qué estás imprimiendo en cada iteración?

La modificación más simple que podrías hacer sería:

 for tag in tags: x = x.replace(tag, '')