Анализировать данные из нескольких одинаково структурированных блоков текстового файла в Python - PullRequest
1 голос
/ 29 апреля 2019

У меня есть текстовый файл, в котором есть несколько таких блоков текста:

Module Resistor_SMD:R_0402_1005Metric (layer B.Cu) (tedit 5B301BBD) (tstamp 5CC0A687)
    (at 120.316179 97.92138 90)
    (descr "Resistor SMD 0402 (1005 Metric), square (rectangular) end terminal, IPC_7351 nominal, (Body size source: http://www.tortai-tech.com/upload/download/2011102023233369053.pdf), generated with kicad-footprint-generator")
    (tags resistor)
    (path /610532D4)
    (attr smd)
    (fp_text reference R59 (at 0 1.17 90) (layer B.SilkS)

Я хочу вытащить следующее: 120.316179, 97.92138 90 and R59

и храните его где-нибудь ...

Затем я хочу взять эту коллекцию позиций и выбросить некоторые из них в зависимости от значения (й) первых двух чисел ... Это координаты XY.

Затем запишите его в список.

Как я могу сделать это с помощью регулярных выражений? Я загружаю файл и пытаюсь следовать здесь , но я теряюсь в добавлении библиотеки панд.

Ответы [ 2 ]

2 голосов
/ 29 апреля 2019

IMO вам не нужно re для этой задачи. Вы можете перебирать строки вашего файла и, в зависимости от сигнальных строк, таких как '(at ' и 'fp_text reference', вы можете заполнять список списков всех ваших данных резистора, например ::

with open('textfile.txt') as f:
    data = []
    row = []
    for line in f:
        if row:
            if '(fp_text ref' in line.strip():
                row.append(line.strip().split()[2])
                data.append(row)
                row = []
        else:
            if '(at ' in line.strip():
                row = line.strip()[:-1].split()[1:4]

print(data)

# [['120.316179', '97.92138', '90', 'R59']]

И если вы хотите, чтобы данные pandas из этих данных:

import pandas as pd 
df = pd.DataFrame(data, columns=['x', 'y', 'z', 'R'])
print(df)

#             x         y   z    R                            
# 0  120.316179  97.92138  90  R59
0 голосов
/ 29 апреля 2019

Этот RegEx может помочь вам захватить три желаемые строки:

([\d]+\.[\d]{5,}|R[0-9]+)
  • Существует два простых шаблона, связанных с использованием | (ИЛИ):

    • тот, что слева ([\d]+\.[\d]{5,}) проверяет ваши нужные числа с плавающей запятой с границей 5+ для части с плавающей запятой, и
    • тот, что справа (R[0-9]+) имеет левую границу R .
  • Вы можете просто изменить эти границы, как пожелаете, и вызвать захваченный вывод, используя $ 1 , и выполнить кодирование.

  • Вы можете экранировать метасхемы, специфичные для языка, такие как . , используя \ , если необходимо.

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...