Python中读取标签的字符串,json?

时间:2013-10-12 12:12:28

标签: python string

我正在为logitech媒体服务器使用telnet api,以获取pylms python库中未包含的功能。

我无法处理请求的响应。

以下是作为单个字符串的响应示例

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:”标签列表?

2 个答案:

答案 0 :(得分: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代码段)

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

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