Найти - Пользователи
Полная версия: Парсинг данных строго между двумя подстроками
Начало » Python для новичков » Парсинг данных строго между двумя подстроками
1
yegorov-p
Привет.
Пытаюсь распарсить файлик с логами, столкнулся с небольшой проблемой: как заставить парсить данные только между определенными подстроками? Поясню на примере.
Файл выглядит примерно так:
name=rtu, status=up
name=yui, status=down

status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
требуется получить значения name и status, но только те, что содержатся между status=“ и ”
Если парсить нечто вроде
name=(\S*), status=(\S*)
то предсказуемо парсится вообще все.
alexx11
не совсем понятно что хочет ТС: толи нужны все name и status удовлетворяющие условиям, то ли пары. Если же всё таки пары, то в исходном тексте какая закономерность их расположения: из примера видно что вперемешку, а может ли быть такое что например идут 3 name а потом 3 status.
yegorov-p
В идеале хотел бы получить
[,
,
,
]
alexx11
вопрос в другом, недостаточно информации об исходных данных.
status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
Здесь в примере я вижу name status name name status name status. Остаётся домысливать как они могут располагаться, что может привести к ошибки. Проще более точно описать задачу.
regall
Для выделения блока со статусами воспользуйтесь регулярным выражением:
>>> x = """name=rtu, status=up
... name=yui, status=down
...
... status="
... name=asd, status=up
... status=down, name=yye
... name=dfg, status=up
... name=khj, status=down
... " """
>>> import re
>>> re.findall('status=".*"',x,flags=re.DOTALL)[0]
'status="\nname=asd, status=up\nstatus=down, name=yye\nname=dfg, status=up\nname
=khj, status=down\n"'
Получите нужный блок. Выделите только нужные строки. Например, в этом случае:
>>> result = re.findall('status=".*"',x,flags=re.DOTALL)[0].split('\n')[1:-1]
>>> print result
['name=asd, status=up', 'status=down, name=yye', 'name=dfg, status=up', 'name=kh
j, status=down']
>>>
Дальше, думаю, разберетесь…
yegorov-p
alexx11
вопрос в другом, недостаточно информации об исходных данных.
status="
name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
"
Здесь в примере я вижу name status name name status name status. Остаётся домысливать как они могут располагаться, что может привести к ошибки. Проще более точно описать задачу.
А, в это смысле. В каждой строке может быть не больше одного name или status. Ну то есть варианта
name=asd, name=fsfsdlj, status=up
быть не может. Опять же, может быть только name или только status
Порядок может быть произвольный, то есть name может стоять как в начале, так и в конце.
alexx11
В таком случаее я бы пошёл по пути как описал regall, но если же сплит по строкам не устраивает, то можно данные полученные в двойных кавычках скормить:
result = '''name=asd, status=up
status=down, name=yye
name=dfg, status=up
name=khj, status=down
name=nnn,
status=sss
'''
print re.findall("(\w+)=(\w+).*?(?:(\w+)(?:=)(\w+).*?\n|\n)", result, re.S)
[('name', 'asd', 'status', 'up'), ('status', 'down', 'name', 'yye'), ('name', 'dfg', 'status', 'up'), ('name', 'khj', 'status', 'down'), ('name', 'nnn', '', ''), ('status', 'sss', '', '')]
При желании можно уже словарик сделать.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB