[ Foro de Python ]
Buenas tardes y gracias de antemano.
Soy muy nuevo ene esto de Python y estoy intentando leer un archivo en el que cada linea es una frase, y comparar la palabras de cada frase con un grupo de palabras que tengo en una lista. Si en la frase existe alguna de las palabras de la lista quiero imprimir la frase pero que las palabras coincidentes aparezcan en rojo. hasta ahora he conseguido esto:
import re
RED = '\033[1;31m'
NOCOLOR = '\033[0;0m'
lista = ['madrid','tren','barcelona','coche']
dict = {}
for item in lista:
dict[item] = True
ocurrencias = []
with open('texto2.txt') as lineas:
for linea in lineas:
for w in dict:
if w in linea:
ocurrencias.append(linea)
for frase in ocurrencias:
aImprimir = frase
for palabra in dict:
if palabra in frase:
aImprimir = re.sub(r'\b(%s)\b' % palabra, r'%s\1%s' % (RED, NOCOLOR), frase)
break
print (aImprimir)
Esto funciona solo a medias. Si Busco la palabra 'tren' y en la frase hay palabras como 'Trenza' o 'Encuentren', tambien me las da como buenas, y me gustaria que solo me diese por buenas las palabras exactas.
Por otro lado si en un texto existe mas de una palabra que coincide con las de la lista, la frase se me imprime dos veces y solo se me coloroea una de las palabras, y me gustaria que solo se imprimiera una vez y que se colorearan todas las palabras coincidentes.
Muchas gracias de antemano
Tu problema parece estar aquí:
if w in linea:
que se podría traducir por "si w está en línea". La forma de decir "si w es línea" (exactamente igual, no "contenido en") sería
if w == linea:
Gracias por tu respuesta Nacho.
Ya he conseguido encontrar las palabras exactas mediante expresiones regulares y no duplico la linea gracias al break, Ya solo me faltaria colorear todas las palabras de la frase que coincidan con los terminos.:
import re
RED = '\033[1;31m'
NOCOLOR = '\033[0;0m'
lista = ['madrid','tren','barcelona','coche']
dict = {}
for item in lista:
dict[item] = True
with open('texto2.txt') as lineas:
for linea in lineas:
for w in dict:
if re.findall(r'\b(%s)\b' % w, linea):
aImprimir = re.sub(r'\b(%s)\b' % w, r'%s\1%s' % (RED, NOCOLOR), linea)
print (aImprimir)
break
(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)