Autor Tema: Expresiones regulares, buscar en un archivo de texto.  (Leído 3020 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Expresiones regulares, buscar en un archivo de texto.
« en: 19 de Octubre de 2021, 10:24:12 »
Hola gente, ¿como están?, les deseo a todos un bello bello Martes.-
Me metí de lleno a aprender expresiones regulares y bueno las cosas mas sencillas la estoy logrando pero en esto me trabe y x mas que lo charlo a Google no me da la respuesta.-
Esto es lo que contiene mi base de datos(archivo.txt) lo que deseo aprender es como buscar x uno de los 3 campos(de ser posible el campo: descripción del producto) y poner en la lista toda la línea(código, descripción y precio).-
Bueno es todo, a continuación dejo lo que llevo hecho y el archivo.-
Desde ya gracias y slds. Daniel.

0001 - Tomate perita Arcor $ 75.90
0002 - Ensalada de frutas La Emilia $ 175.90
0003 - Extracto de tomate Arcor $ 95.20
0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
0007 - Galletitas Granis con semamo x 290 grs. $ 70.00
0008 - Sal parrillera 2 anclas x 500 grs. $79.90
0009 - Extracto de tomate Macari $ 82.20
0010 - Tomate perita Molto $ 65.90
0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
0012 - Durazno al natural Molto x 850 grs. $ 179.50
0013 - Mayonesa Natura x 250 grs. $ 105.90
0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
0015 - Durazno al natural Arcor x 850 grs. $ 200.50
0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50

Código: Python
  1. import re
  2. archivo = open("prueba_ER.txt", "r")
  3. texto = archivo.read()
  4. archivo.close()
  5.  
  6. buscar = "tomate"
  7. resultado = []
  8.  
  9. for item in re.findall("tomate.+", texto):
  10.     resultado.append(item)
  11.    
  12.    
  13. print(resultado)
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #1 en: 19 de Octubre de 2021, 11:23:43 »
A ver si esto es lo que buscas:

Código: Python
  1. import re
  2.  
  3. texto = """0001 - Tomate perita Arcor $ 75.90
  4. 0002 - Ensalada de frutas La Emilia $ 175.90
  5. 0003 - Extracto de tomate Arcor $ 95.20
  6. 0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
  7. 0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
  8. 0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
  9. 0007 - Galletitas Granis con semamo x 290 grs. $ 70.00
  10. 0008 - Sal parrillera 2 anclas x 500 grs. $79.90
  11. 0009 - Extracto de tomate Macari $ 82.20
  12. 0010 - Tomate perita Molto $ 65.90
  13. 0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
  14. 0012 - Durazno al natural Molto x 850 grs. $ 179.50
  15. 0013 - Mayonesa Natura x 250 grs. $ 105.90
  16. 0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
  17. 0015 - Durazno al natural Arcor x 850 grs. $ 200.50
  18. 0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50"""
  19.  
  20. lineas = texto.split('\n')
  21.  
  22. for linea in lineas:
  23.     if re.search('tomate', linea, re.IGNORECASE):
  24.         print(linea)

Salida:
Código: [Seleccionar]
0001 - Tomate perita Arcor $ 75.90
0003 - Extracto de tomate Arcor $ 95.20
0009 - Extracto de tomate Macari $ 82.20
0010 - Tomate perita Molto $ 65.90

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #2 en: 19 de Octubre de 2021, 11:31:49 »
La lectura de una cadena de texto desde un archivo es mejor hacerla así:

Código: Python
  1. import codecs
  2.  
  3. with codecs.open('prueba_ER.txt', 'r', encoding='utf-8') as archivo:
  4.     texto = archivo.read()

De esa forma, al terminar de leer se cerrará el archivo (archivo.close()) que es lo que deberías haber añadido en tu programa, pero ya lo hace Python por ti con la sentencia with.

Por otro lado, con el módulo codecs, puedes leer archivos UTF-8 con tildes, eñes, etc y reconocer esos caracteres especiales sin problemas.

« Última modificación: 19 de Octubre de 2021, 14:46:48 por Picuino, Razón: Corrijo la forma de cerrar un archivo con close() »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #3 en: 19 de Octubre de 2021, 11:46:02 »
Luego lo charlamos, ahora me aboco a memorizar lo del código, gracias..

Traceback (most recent call last):
  File "C:\Users\Daniel\Mega\Mega\Python\Programas\ArchivoER.py", line 5, in <module>
    texto = archivo.read()
  File "C:\Users\Daniel\AppData\Local\Programs\Thonny\lib\codecs.py", line 701, in read
    return self.reader.read(size)
  File "C:\Users\Daniel\AppData\Local\Programs\Thonny\lib\codecs.py", line 504, in read
    newchars, decodedbytes = self.decode(data, self.errors)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xb4 in position 494: invalid start byte
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #4 en: 19 de Octubre de 2021, 11:52:15 »
Prueba esto para guardar el archivo de texto en formato UTF-8:

Código: Python
  1. import codecs
  2.  
  3. texto = """0001 - Tomate perita Arcor $ 75.90
  4. 0002 - Ensalada de frutas La Emilia $ 175.90
  5. 0003 - Extracto de tomate Arcor $ 95.20
  6. 0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
  7. 0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
  8. 0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
  9. 0007 - Galletitas Granis con sésamo x 290 grs. $ 70.00
  10. 0008 - Sal parrillera 2 anclas x 500 grs. $79.90
  11. 0009 - Extracto de tomate Macari $ 82.20
  12. 0010 - Tomate perita Molto $ 65.90
  13. 0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
  14. 0012 - Durazno al natural Molto x 850 grs. $ 179.50
  15. 0013 - Mayonesa Natura x 250 grs. $ 105.90
  16. 0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
  17. 0015 - Durazno al natural Arcor x 850 grs. $ 200.50
  18. 0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50"""
  19.  
  20. with codecs.open('prueba_ER.txt', 'w', encoding='utf-8') as archivo:
  21.     archivo.write(texto)

Edito:
También puedes cambiar el formato a UTF-8 editando el ficheros de texto con Notepad++ y luego modificarlo en el menú Codificación.  https://notepad-plus-plus.org/
Es un editor de texto bastante bueno.

Un saludo.
« Última modificación: 19 de Octubre de 2021, 11:55:45 por Picuino »

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #5 en: 19 de Octubre de 2021, 14:20:47 »
Lo que voy a aprender de Python con vosotros  :-/ :-/ :-/

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #6 en: 19 de Octubre de 2021, 17:05:11 »
Muchas gracias Picuino todo funciona a la perfección, gracias.
Ahora tengo este inconveniente.

Código: Python
  1. print("\n ======= Resultado de la búsqueda =======")
  2. for linea in lineas:
  3.     if re.search("0004|0005|0006|0007|0008|0009", linea, re.IGNORECASE):
  4.         print(linea)
Debo suponer que tantos “or” pueden ser reemplazados x algo mas corto ¿estoy en lo cierto?, gracias.
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #7 en: 19 de Octubre de 2021, 17:34:18 »
Lo primero que voy a quitar es la opción re.IGNORECASE, que significa que no distinga entre mayúsculas y minúsculas. En este caso, con números, no hace falta.

Después esos números se pueden resumir con un corchete:

Código: Python
  1. print("\n ======= Resultado de la búsqueda =======")
  2. for linea in lineas:
  3.     if re.search("000[4-9]", linea):
  4.         print(linea)


Edito:
conviene decirle que el número se encuentra al comienzo de la línea, con el caracter '^':

Código: Python
  1. print("\n ======= Resultado de la búsqueda =======")
  2. for linea in lineas:
  3.     if re.search("^000[4-9]", linea):
  4.         print(linea)

« Última modificación: 19 de Octubre de 2021, 17:42:25 por Picuino »

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #8 en: 19 de Octubre de 2021, 17:36:43 »
Otra forma de hacerlo es traducir el índice a un número y manejarlo así:

Código: Python
  1. for linea in lineas:
  2.     indice = int(linea[:4])
  3.     if indice >= 4 and indice <= 9:
  4.         print(linea)

linea[:4] son los 4 primeros caracteres de la línea (los que corresponden a un número). Se puede hacer de otras formas, pero esta por ahora es sencilla.

Edito
Por ejemplo otra manera de cortar el índice sería:
 indice = int(linea.split('-')[0])
« Última modificación: 19 de Octubre de 2021, 17:38:50 por Picuino »

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #9 en: 19 de Octubre de 2021, 17:47:55 »
Ok Picuino  ((:-)) ((:-)) ((:-)), bueno esto me queda como tarea, hacer que el operario ingrese en la búsqueda “1004 1010” y pasarlo al formato que propusiste mediante programación.-
Ni bien lo logre pongo el código, saludos cordiales.-
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #10 en: 19 de Octubre de 2021, 18:02:13 »
Ten en cuenta que traducir todo te va a costar mucho trabajo.
El operario eres tú. Si tu sabes cómo decirle a Python la manera de buscar algo, no te compliques más.

Si buscas un ejercicio interesante, yo he utilizado en ocasiones Python para extraer datos de un documento PDF.
Primero lo convierto a texto con estas herramientas (https://www.xpdfreader.com/) y luego lo proceso con Python.

Por ejemplo a mi me ha servido para traducir los datos de los registros de control de un PIC que aparecen en el datasheet, a un programa en C para manejarlos. Eso es demasiado complejo para ponerse ahora con ello, pero hacer búsquedas de texto sencillas en un PDF real puede ser interesante.

Saludos.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #11 en: 19 de Octubre de 2021, 19:04:58 »
Citar
Ten en cuenta que traducir todo te va a costar mucho trabajo.
El operario eres tú. Si tu sabes cómo decirle a Python la manera de buscar algo, no te compliques más.
Que esclarecedora son estas palabras, pero quiero hacerlo para renegar un poco y renegar me va a ayudar a crecer.-
Este x el momento es mi criterio:
Si se ingresa un 1(código) lo completo con esto:buscar = buscar.zfill(4)
Si ingresa alguna letra la búsqueda se producirá en el campo descripción.
Si ingresa algún punto la búsqueda se producirá en el campo precio.-
Voy a seguir picando código, gracias x tu tiempo.- 
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-

Desconectado Nocturno

  • Administrador
  • DsPIC33
  • *******
  • Mensajes: 18310
    • MicroPIC
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #12 en: 20 de Octubre de 2021, 01:55:12 »
Ten en cuenta que traducir todo te va a costar mucho trabajo.
El operario eres tú. Si tu sabes cómo decirle a Python la manera de buscar algo, no te compliques más.

Si buscas un ejercicio interesante, yo he utilizado en ocasiones Python para extraer datos de un documento PDF.
Primero lo convierto a texto con estas herramientas (https://www.xpdfreader.com/) y luego lo proceso con Python.

Por ejemplo a mi me ha servido para traducir los datos de los registros de control de un PIC que aparecen en el datasheet, a un programa en C para manejarlos. Eso es demasiado complejo para ponerse ahora con ello, pero hacer búsquedas de texto sencillas en un PDF real puede ser interesante.

Saludos.
¡Qué buena idea!, no se me habría ocurrido hacerlo con Python, quizás con Excel, pero me lo apunto para cuando me haga falta.

Desconectado Picuino

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 5892
    • Picuino
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #13 en: 20 de Octubre de 2021, 07:35:55 »
Con Python puedes formatear el texto plano que salga de un PDF para cambiarlo a formato CSV e importarlo luego en excel.

Por ejemplo con los datos de Daniel:

Código: Python
  1. import re
  2.  
  3. texto = """0001 - Tomate perita Arcor $ 75.90
  4. 0002 - Ensalada de frutas La Emilia $ 175.90
  5. 0003 - Extracto de tomate Arcor $ 95.20
  6. 0004 - Pimientos morrones lata x 200 grs. Arcor $ 105.20
  7. 0005 - Sal fina Celusal pte. x 500 grs. $ 50.50
  8. 0006 - Galletitas Surtido de Bagley x 390 grs. $ 125.00
  9. 0007 - Galletitas Granis con sésamo x 290 grs. $ 70.00
  10. 0008 - Sal parrillera 2 anclas x 500 grs. $79.90
  11. 0009 - Extracto de tomate Macari $ 82.20
  12. 0010 - Tomate perita Molto $ 65.90
  13. 0011 - Mayonesa Hellman´s x 250 grs. $ 99.00
  14. 0012 - Durazno al natural Molto x 850 grs. $ 179.50
  15. 0013 - Mayonesa Natura x 250 grs. $ 105.90
  16. 0014 - Pimientos morrones lata x 200 grs. Molto $ 95.00
  17. 0015 - Durazno al natural Arcor x 850 grs. $ 200.50
  18. 0016 - Fideos Terrabussi soperos x 500 grs. $ 89.50"""
  19.  
  20. lineas = texto.split('\n')
  21. for linea in lineas:
  22.     campos = re.split(' - | \$ ?', linea)
  23.     print('{},{},{}'.format(*campos))

La salida será un texto que sirve como documento csv:
Código: [Seleccionar]
0001,Tomate perita Arcor,75.90
0002,Ensalada de frutas La Emilia,175.90
0003,Extracto de tomate Arcor,95.20
0004,Pimientos morrones lata x 200 grs. Arcor,105.20
0005,Sal fina Celusal pte. x 500 grs.,50.50
0006,Galletitas Surtido de Bagley x 390 grs.,125.00
0007,Galletitas Granis con sésamo x 290 grs.,70.00
0008,Sal parrillera 2 anclas x 500 grs.,79.90
0009,Extracto de tomate Macari,82.20
0010,Tomate perita Molto,65.90
0011,Mayonesa Hellman´s x 250 grs.,99.00
0012,Durazno al natural Molto x 850 grs.,179.50
0013,Mayonesa Natura x 250 grs.,105.90
0014,Pimientos morrones lata x 200 grs. Molto,95.00
0015,Durazno al natural Arcor x 850 grs.,200.50
0016,Fideos Terrabussi soperos x 500 grs.,89.50

Y luego puedes hacer también labores de búsqueda y extracción directamente en excel.

Desconectado Daniel1952

  • PIC16
  • ***
  • Mensajes: 127
Re:Expresiones regulares, buscar en un archivo de texto.
« Respuesta #14 en: 04 de Noviembre de 2021, 11:37:39 »
Hola gente, mi consulta esta vez es mas de criterio que de código, pongo a continuación lo que tengo en un archivo de texto y para mostrar x partes me imagine que la única manera era “codificandolo”, ¿es correcta esta manera o Uds. me proponen otra?
Bueno es todo, abrazo y desde ya gracias.

Citar
100 Vamos a comenzar con una breve discusión acerca de terminología.
100 En una lección previa, dependiendo del sistema operativo de tu
100 computadora: Mac, Windows, Linux, viste cómo se envía información
100 a la ventana de “comando de salida” en tu editor de texto mediante
100 la utilización del comando print de Python.

101 El lenguaje de programación Python es del tipo orientado a objetos.
101 Esto quiere decir que está construido alrededor de un tipo especial de
101 entidad, un objeto, que contiene a la vez datos así como una serie de
101 métodos para acceder y alterar los datos. Una vez que se crea un objeto
101 se puede interactuar con otros objetos.

102 En el ejemplo de arriba vimos un tipo de objeto, la cadena (string)
102 “Hola Mundo”. La cadena es la secuencia de una serie de caracteres
102 encerrados entre comillas. Puedes escribir una cadena de tres maneras distintas:

Código: Python
  1. import re
  2. import codecs
  3.  
  4. with codecs.open('Decretos.txt', 'r+', encoding='utf-8') as archivo:
  5.     linea = archivo.read()
  6.     lineas = linea.split('\n')
  7.    
  8.     buscar = input("\n Ingrese lo que desea buscar...: ")
  9.     print("\n============================================================")
  10.     for linea in lineas:
  11.         if re.search(buscar, linea, re.IGNORECASE):
  12.             print(linea[4:])
« Última modificación: 04 de Noviembre de 2021, 11:40:20 por Daniel1952 »
abraza las cosas y personas malas como si fueran tu mas preciada joya,Son tus mas grandes maestros de paciencia sabiduría y amor y cuando lo abrazas dejan de causar dolor.-