Чтение адресов EEPROM в Python и выполнение операций - PullRequest
0 голосов
/ 07 декабря 2018

В настоящее время я пытаюсь сопоставить шаблон для текстового файла дампа eeprom, чтобы найти определенный адрес, а затем пройти 4 шага, как только я столкнулся в поиске.Я пробовал следующий код для поиска шаблона

regexp_list = ('A1 B2')
line = open("dump.txt", 'r').read()
pattern = re.compile(regexp_list)

matches = re.findall(pattern,line)

for match in matches:
    print(match)

, который сканирует дамп на A1 B2 и отображает, если найден.Мне нужно добавить больше таких адресов в критерии поиска, например: 'C1 B2', 'D1 F1'.Я попытался сделать regexp_list списком, а не кортежем, но это не сработало.

Это одна из проблем.Затем, когда я нажимаю на поиск, я хочу пройти 4 места и затем прочитать адрес оттуда (см. Ниже).

Ввод:

0120   86 1B 00 A1  B2 FF 15 A0  05 C2 D1 E4  00 25 04 00 

Здесь, когда поиск находит A1 B2, я хочу переместить 4 места, т.е. сохранить данные из C2 D1 E4 из дампа.

Ожидаемый результат:

C2 D1 E4

Надеюсь, объяснение было ясным.

#

Благодаря @kcorlidy

Вот последний фрагмент кода, который мне пришлось ввести, чтобы удалить адреса в первом столбце.

newtxt = (text.split("A0 05")[1].split()[4:][:5])

for i in newtxt:
    if len(i) > 2:
        newtxt.remove(i)

, поэтому полный код выглядит следующим образом

import re

text = open('dump.txt').read()

regex = r"(A1\s+B2)(\s+\w+){4}((\s+\w{2}(\s\w{4})?){3})"

for ele in re.findall(regex,text,re.MULTILINE):

    print(" ".join([ok for ok in ele[2].split() if len(ok) == 2]))

print(text.split("A1 B2")[1].split()[4:][:5])

#selects the next 5 elements in the array including the address in 1st col
newtxt = (text.split("A1 B2")[1].split()[4:][:5])

for i in newtxt:
    if len(i) > 2:
        newtxt.remove(i)

Ввод:

0120 86 1B 00 00 C1 FF 15 00 00 A1 B2 00 00 00 00 C2
0130 D1 E4 00 00 FF 04 01 54 00 EB 00 54 89 B8 00 00

Ввод:

C2 0130 D1 E4 00

C2 D1 E4 00

1 Ответ

0 голосов
/ 08 декабря 2018

Используя регулярное выражение, можно извлечь текст, но вы также можете завершить его через разделенный текст.

Регулярное выражение:

  1. (A1\s+B2) строка начинается с A1 + one or more space +B2
  2. (\s+\w+){4} переместить 4 места
  3. ((\s+\w+(\s+\w{4})?){3}) извлечь 3 группы строк, и в группе может быть 4 ненужных символа.Затем объедините их в одну.

Разделить:

Примечание. Если у вас очень длинный текст или несколько строк, не используйте этот способ.

  1. text.split("A1 B2")[1] разделить текст на две части.после мы должны
  2. .split() разделить на пустое пространство и стать списком ['FF', '15', 'A0', '05', 'C2', 'D1', 'E4', '00', '25', '04', '00']
  3. [4:][:3] переместить 4 места и выбрать первые три

Тестовый код:

import re

text = """0120   86 1B 00 A1  B2 FF 15 A0  05 C2 D1 E4  00 25 04 00 
0120 86 1B 00 00 C1 FF 15 00 00 A1 B2 00 00 00 00 C2
0130 D1 E4 00 00 FF 04 01 54 00 EB 00 54 89 B8 00 00 """
regex = r"(A1\s+B2)(\s+\w+){4}((\s+\w{2}(\s\w{4})?){3})"

for ele in re.findall(regex,text,re.MULTILINE):
    #remove the string we do not need, such as blankspace, 0123, \n
    print(" ".join([ok for ok in ele[2].split() if len(ok) == 2]))

print( text.split("A1  B2")[1].split()[4:][:3] )

Выход

C2 D1 E4
C2 D1 E4
['C2', 'D1', 'E4']
...