[ Foro de Python ]

Busqueda exacta de texto e impresion en color

01-Jun-2017 18:06
Invitado (pepe)
2 Respuestas

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


01-Jun-2017 19:47
Nacho Cabanes (+31)

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:
 


 


01-Jun-2017 20:28
Invitado (pepe)

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.)