Как добавить набор буквенно-цифрового содержимого в список с помощью Python?

У меня есть файл журнала с датой, временем, именем процесса и данными пакета в алфавитно-цифровом формате, разделенными пробелом.

Пример строки:

Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55

Я написал регулярное выражение для анализа содержимого и получения данных пакета. Теперь я хочу, чтобы эти пакетные данные были сохранены в списке, чтобы я мог написать сценарий сравнения, чтобы сравнить его с новым списком. Я создал новый список и использовал append внутри цикла for для добавления каждого элемента данных пакета. Я ожидал увидеть мой список вроде ['55','34','00','c9','00','11','45','55], но я получаю ['5','','5','','3','','4','','0','','0' и т. Д.].

Для цикла я использовал:

for packs in match.group(6):
       list.append(packs)

Как получить список со значением в нужном мне формате?

5 ответов

Решение

Использование re.findall функция.

re.findall(r'(?<!\S)[A-Za-z\d]{2}(?!\S)', string)

Пример:

>>> s = "Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55"
>>> re.findall(r'(?<!\S)[A-Za-z\d]{2}(?!\S)', s)
['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']

Объяснение:

  • (?<!\S) Отрицательный взгляд за спиной утверждает, что совпадению не будет предшествовать непробельный символ.
  • [a-z\d]{2} Соответствует строчным буквам или цифрам ровно два раза.
  • (?!\S) Отрицательный взгляд утверждает, что за совпадением не последует непробельный символ.

Вы можете сделать это в каждой строке

line = "Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55"

new_list = line.split(':')[1].split()

Просто измените свое старое регулярное выражение и добавьте [0].split() чтобы получить результат, который вы хотите.

import re
x="Date Time ProcessName ActivityName : 55 34 00 aa c9 00 11 45 55"
print re.findall(r"(?<=:)\s*([\da-zA-Z]{2}(?:\s[\da-zA-Z]{2})*)",x)[0].split()

Выход:['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']

Попробуйте это. Это даст вам список того, что вы хотите.

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

...
list.append(...)
DATA=''.join(list)

Тогда вы получите строку вроде этого: '553400c90011...'

Итерация по строке даст один символ за раз. Сначала вам нужно разделить строку:

>>> data.split()
['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']

Вы также можете уточнить разделитель:

>>> data.split(' ')
['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']

Если вы хотите использовать регулярные выражения, смотрите ответ Avinash Raj. В противном случае получить число можно только с разбиением, если форма линии всегда одинакова:

>>> line.split(' : ')[1].split(' ')
['55', '34', '00', 'aa', 'c9', '00', '11', '45', '55']
Другие вопросы по тегам