es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Análisis de expresiones regulares en un archivo de texto.

Tengo un archivo de texto grande que contiene información de la siguiente manera:

0 / END OF ONE DATA, BEGIN SECOND DATA
361,315,0,’1 ‘,1,1,1,0,0,2,’NAT1 ‘,1,1115,1,0,0,0,0,0,0
0.0055501,0.12595,100
1,69,0,100,100,100,1,36,1.1,0.9,1.04283,1.001283,33,0,0,0, /[name1 ]/
0.975,138
481,417,0,’1 ‘,1,1,1,0,0,2,’KAT1 ‘,1,115,1,0,0,0,0,0,0
0.00762817,0.14163,60
1,69,0,60,60,60,1,48,1.1,0.9,1.011735,0.917735,33,0,0,0, /[name2 ]/
0 / END OF SECOND DATA, BEGIN THIRD DATA

Quiero obtener lo siguiente en un dataframe:

name1
name2

Intenté lo siguiente:

import os, pandas as pd
from io import StringIO
fn = r’C:\Users\asdert\Downloads\Network.RAW’
file = open(fn)
line = file.read() # .replace(“\n”, “$$$$$”)
file.close()
start = line.find(‘END OF ONE DATA, BEGIN SECOND DATA’) + 1
end = line.find(‘END OF SECOND DATA, BEGIN THIRD DATA’)
branchData = line[start:end]
df = pd.read_csv(StringIO(branchData), sep=’\n’)

No estoy seguro de cómo abordar esto. Básicamente, tengo que analizar el texto entre /* y */ e ignorar las líneas que no tengan /* y */.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para extraer la información entre /* y */, se puede utilizar regex con el módulo re en Python. Aquí hay una forma de abordarlo:

    1. Cree una lista vacía para almacenar los nombres extraídos del archivo de texto:
      nombres = []
      
    2. Use regex para encontrar todas las líneas que contengan /* y */. Por ejemplo, puede usar el patrón /\*(.+?)\*/ para coincidir con cualquier cosa entre /* y */.
    3. Para cada línea que contenga el patrón, extraiga el nombre dentro de los corchetes [] utilizando otro patrón regex, como \[(.+?)\].

    4. Agregue el nombre extraído a la lista nombres.

    Aquí está el código completo:

    import re
    
    # Abra y lea el archivo de texto
    with open('archivo.txt', 'r') as archivo:
        texto = archivo.read()
    
    # Inicialice una lista vacía para nombres
    nombres = []
    
    # Use regex para encontrar líneas que contengan "/*" y "*/"
    patron = re.compile(r'/\*(.+?)\*/', re.DOTALL)
    coincidencias = re.findall(patron, texto)
    
    # Para cada coincidencia, extraiga el nombre dentro de [] y agréguelo a nombres
    for coincidencia in coincidencias:
        patron_nombre = re.compile(r'\[(.+?)\]')
        coincidencia_nombre = re.search(patron_nombre, coincidencia)
        if coincidencia_nombre:
            nombres.append(coincidencia_nombre.group(1))
    
    # Imprime la lista de nombres
    print(nombres)
    

    Esto debería producir la siguiente salida:

    ['nombre1', 'nombre2']
    

    Luego, puede convertir esta lista en un dataframe de pandas usando:

    import pandas as pd
    
    df = pd.DataFrame(nombres, columns=['Nombres'])
    

Comments are closed.