2013-10-12 15 views
-1

我正在使用logitech媒体服务器的telnet api来查找不包含在pylms python库中的函数。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格式化吗?我试着用json.load和json.dump python模块阅读,但没有运气。最近得到的是使用。 split(" ")然后split(":")但是当一个标签由两个单词组成,即包含空格时,这会落空。

总结一下如何获得“name:”标签的列表?

+0

我不确定这是为什么我问“json格式?”在我的问题。但从你的答案看来,它不是。 – user2873882

+0

是的,我在这里很新,我不明白你为什么说我的语气没有建设性,我不确定这是不是Json格式。我不是故意感情,我只是在建议之后。对不起,如果有任何误解。 – user2873882

+0

所以如果你说标签可以包含空格,那么“玩家数量:2”是如何分析的 - 作为“玩家”,“数量:2”还是“玩家数”:2''? – fjarri

回答

0

我不知道你想输出的确切类型,但我想我有一个如何使用正则表达式来创建一个有用的数据结构的想法,与'name''ip'标签。

从REPL:

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)试图尽可能多地匹配str上的regex。输出是2元组的list,其中每个元组的第一个元素是来自正则表达式第一个捕获括号的匹配,第二个元素是来自正则表达式第二个捕获括号的匹配。

有关Python正则表达式的更多详细信息,请参阅http://docs.python.org/2/library/re.html

+0

首先感谢您的解释良好的答复。你的代码在给定的例子中工作的很好,但是它在我使用负载的分割字符串函数的地方堕落了。即当名称标签包含一个空格,例如“”name:test test“时,标签中的空间似乎让所有的事情都感到不安,对不起,我应该把它放在我的字符串示例上,尽管我认为正则表达式是前进的方向。 “name:”和“model:”标记不应包含全名标记,即使它包含空格。任何想法??再次感谢。 – user2873882

+0

@ user2873882您能否提供一个示例字符串,其中包含一些空格值?另外,必须有一些方法来将键和值分开,我假设它是一个空格,但是如果字符串类似于“键一:键一键二:值2”,那么我不确定如何判断子字符串“value one key two”的哪一部分属于第二个键,哪个部分属于第一个值 – dg123

+0

确定示例字符串#玩家0 2计数:2玩家索引: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:down stairs model:slimp3 displaytype:noritake-katakana connected:1注意:“name:down stairs”只有标签项目可能包含空格的文本,标签名称不包含。所以它无法在名称和模型之间查找完整的名称项目?再次欢呼。 – 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

您的示例适用于上述代码,但在名称标签包含空格时会出现问题。即“名称:测试测试”我的例子字符串没有任何空格里面的名称标签sodds法。有任何想法吗?再次欢呼你的时间 – user2873882