2013-10-12 3 views
-1

Я использую telnet api для медиа-сервера logitech для функций, не включенных в библиотеку pythons pylms.Python чтение тегов в строке, json?

Я придерживаюсь ответа на запрос.

Ниже приведен пример ответа в виде одной строки

players 0 2 count:2 playerindex:0 playerid:a5:41:d2:cd:cd:05 ip:127.0.0.1:60488 name:127.0.0.1 model:softsqueeze displaytype:graphic-280x16 connected:1 playerindex:1 playerid:00:04:20:02:00:c8 ip:192.168.1.22:3483 name:Movy model:slimp3 displaytype:noritake-katakana connected:1 

Я хочу, чтобы извлечь имя и IP-тегов для приведенного выше примера. Взгляд в Интернете - это создание json? Ive пробовал читать с json.load и json.dump python, но не повезло. Закрытие ive получено. split(" "), а затем split(":"), но это падает, когда тег состоит из двух слов, т.е. содержит пробел.

Подводя итоги, как получить список тегов «name:»?

+0

Я не был уверен, что именно поэтому я спросил «json formating?» в моем вопросе. Но из вашего ответа, похоже, нет. – user2873882

+0

Да, я очень новичок здесь, я не понимаю, почему вы говорите, что мой тон не конструктивен, я не был уверен, что это было json-формирование. Я не собираюсь утверждать, что я был только после консультации. Извините, если возникли недоразумения. – user2873882

+0

Итак, если вы говорите, что теги могут содержать пробелы, тогда как '' игроки подсчитывают: 2'' parsed - как '' игроки'', '' count: 2'' или '' "players count": 2''? – fjarri

ответ

0

Я не уверен в точности типа продукции вы хотите, но я думаю, что у меня есть представление о том, как создать полезную структуру данных с помощью регулярных выражений, с тегами 'name' и 'ip'.

С РЕПЛ:

In [38]: str = 'players 0 2 count:2 playerindex:0 playerid:a5:41:d2:cd:cd:05 ip:127.0.0.1:60488 name:127.0.0.1 model:softsqueeze displaytype:graphic-280x16 connected:1 playerindex:1 playerid:00:04:20:02:00:c8 ip:192.168.1.22:3483 name:Movy model:slimp3 displaytype:noritake-katakana connected:1' 

In [39]: regex = re.compile(r'([^:]+):(\S+)\s') 

In [40]: regex.findall(str) 
Out[40]: 
[('players 0 2 count', '2'), 
('playerindex', '0'), 
('playerid', 'a5:41:d2:cd:cd:05'), 
('ip', '127.0.0.1:60488'), 
('name', '127.0.0.1'), 
('model', 'softsqueeze'), 
('displaytype', 'graphic-280x16'), 
('connected', '1'), 
('playerindex', '1'), 
('playerid', '00:04:20:02:00:c8'), 
('ip', '192.168.1.22:3483'), 
('name', 'Movy'), 
('model', 'slimp3'), 
('displaytype', 'noritake-katakana')] 

Чтобы извлечь имя и IP-теги, вы можете использовать list comprehension:

lst = regex.findall(str) 
In [45]: name_and_ip_tags = [x for x in lst if x[0] in ['ip', 'name']] 

In [46]: name_and_ip_tags 
Out[46]: 
[('ip', '127.0.0.1:60488'), 
('name', '127.0.0.1'), 
('ip', '192.168.1.22:3483'), 
('name', 'Movy')] 

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

([^:]+):(\S+)\s 

работает как так:

Сначала ([^:]+) соответствует всем остальным, а затем : один или несколько раз, и круглые скобки вокруг этой части регулярного выражения хранят его как первый захват матча.

: буквально просто соответствует :.

(\S+) соответствует всем, кроме пробела, один или несколько раз (из-за +), и скобки делают его второй частью, захваченной совпадением.

\s соответствует одному пространству, которое, кажется, отделяет все ваши записи.

Вызов regex.findall(str) пытается соответствовать regex по адресу str столько раз, сколько может. Вывод - это list из 2-х кортежей, где первый элемент каждого кортежа соответствует совпадению с первой скобкой скобок регулярного выражения, а второй элемент является совпадением со второй захватывающей скобкой регулярного выражения.

См. http://docs.python.org/2/library/re.html для получения дополнительной информации о регулярных выражениях в Python.

+0

Прежде всего спасибо за ваш хорошо объясненный ответ. Ваш код хорошо работает на данном примере, но его падение происходит там, где я получил использование функций разделенных строк. То есть когда тег name содержит пробел, т. е. «имя: test test», пространство в теге, кажется, расстраивает все. Извините, я должен надеть свой пример строки. Хотя я думаю, что regex - это путь вперед. Теги «name:» и «model:» не должны содержать весь тег имени, даже если он содержит пробел. Любые идеи? Спасибо еще раз. – user2873882

+0

@ user2873882 Можете ли вы предоставить образец строки, которая содержит пробел в некоторых Значения? Кроме того, должен быть какой-то способ отделить значения от ключей. Я предположил, что это пробел, но если строка была чем-то вроде «key one: value one key two: value 2», то я не уверен как вы могли бы определить, какая часть подстроки «value one key two» принадлежит второму ключу и какая часть принадлежит первому значению. – dg123

+0

Ok образец строки # игроков 0 2 count: 2 playerindex: 0 playerid: a5: 41: d2 : cd: cd: 05 ip: 127.0.0.1: 60488 имя: 127.0.0.1 модель: softsqueeze displaytype: graphic-280x16 подключенно: 1 playerindex: 1 playerid: 00: 04: 20: 02: 00: c8 ip: 192.168.1.22: 3483 имя: вниз по лестнице модель: slimp3 displaytype: noritake-katakana подключен: 1 Примечание «имя: вниз по лестнице» - это только тег текст, который может содержать пробел, имя тега нет. Так что вы не можете посмотреть между именем: и моделью, чтобы получить полный элемент имени? Приветствует снова. – user2873882

0

Попробуйте regular expression, чтобы извлечь информацию. Я не пробовал это на Python, но думаю, this должен работать. Это может помочь, если вы сообщите нам, каков ожидаемый результат.

import re 
regex = re.compile("ip:([^\\ ]{0,})\\ name:([^\\ ]{0,})") 
testString = "" # fill this in 
matchArray = regex.findall(testString) 
# the matchArray variable contains the list of matches 

(от debuggex.com фрагмент кода)

+0

Ваш пример хорошо подходит для кода выше, но падает, когда тег имени содержит пробел. То есть "name: test test" В моей строке примера не было пробелов внутри имени тега sodds law. Есть идеи? Cheers снова для вашего времени – user2873882

Смежные вопросы