cómo reemplazar solo ciertas palabras en un archivo

Este progtwig es para verificar si dos palabras específicas (ej: ‘ஒன்று’ y ‘கோடி’) aparecen consecutivamente y si es así reemplaza la primera palabra con una palabra en particular (ej: ‘ஒரு’). Tengo que leer los contenidos de un archivo y escribirlos en otro. He usado una variable de marca, inicializada desde 2, y estoy imprimiendo en el archivo solo cuando la bandera% 2 == 0, para que las palabras no se repitan en el nuevo archivo. El pgm funciona solo cuando las palabras están en lugares pares, no funciona de otra manera. ¿Cómo debo cambiar la comprobación y la impresión. Aquí está el código:

filename = raw_input("enter file:") ff = open(filename+'.rep_out','w') with open(filename, 'r') as f: for line in f: words = line.strip().split() flag = 2 for word1, word2 in zip(words, words[1:]): if flag%2 == 0: if word1 == 'ஒன்று' or word1 == '1': if word2 == 'கோடி' or word2 == 'லட்சம்' or word2 == 'ஆயிரம்' : #word1=word1.replace(word1,'ஒரு') word1='ஒரு' #ff.write(word1+" ") ff.write(word1+" ") ff.write(word2+" ") flag=flag+1 f.close() ff.close() 

Cuando las manipulaciones de las cuerdas se vuelven complejas, existe una buena posibilidad de que puedas hacerlo mejor con una herramienta más poderosa que los métodos de cuerdas de Python. En este caso, es un poco más fácil usar expresiones regulares:

 import re with open(filename) as f: with open(filename + '.rep_out') as ff: for line in f: ff.write(re.sub("ஒன்று (கோடி|லட்சம்|ஆயிரம்)", r"ஒரு \1", line)) 

explicación:

la expresión regular "ஒன்று (கோடி|லட்சம்|ஆயிரம்)" coincide con cualquier aparición de ஒன்று seguida consecutivamente por cualquiera de கோடி, லட்சம் o ஆயிரம் – puede extenderlo a tantas segundas palabras candidatas como sea necesario.

re.sub reemplaza eso con la primera palabra de reemplazo (), seguida por la misma segunda palabra que encontró antes: el \ 1 le dice que “ponga el bit que coincide con el primer conjunto de () de nuevo aquí” (ese \ 1 Es por eso que tiene que ser una cadena en bruto, ya que quiere que sea analizada por re.sub, no por las reglas literales de la cadena de Python.

Tal como está escrito, el código anterior asume que las palabras en cada línea están separadas exactamente por un espacio, que es diferente de su código original, lo que permite que estén separados por cualquier espacio en blanco, pero que se generen separados por un solo espacio. Para hacer coincidir ese comportamiento, puede modificar la expresión regular anterior de la siguiente manera:

  re.sub("ஒன்று\s+(கோடி|லட்சம்|ஆயிரம்)", r"ஒரு \1", line) 

La \ s coincide con cualquier carácter de espacio en blanco, y el + significa “coincide con múltiplos de eso en una fila, siempre que haya al menos uno”.

Tenga en cuenta que cuando usa with open(...) as f: no necesita llamar a f.close() después, esto sucede automáticamente cuando sale del bloque with .