-1

我正在为罗技媒体服务器使用 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(":") ,但是当标签由两个单词组成时,即包含一个空格,这就会失败。

总而言之,我如何获得“名称:”标签列表?

4

2 回答 2

0

尝试使用正则表达式来提取信息。我没有在 Python 中尝试过,但我认为应该可以。如果您告诉我们预期的结果可能会有所帮助。

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 片段)

于 2013-10-12T12:39:33.163 回答
0

我不确定您想要的输出类型,但我想我知道如何使用正则表达式创建有用的数据结构,并带有'name'and'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 标签,您可以使用列表推导

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

像这样工作:

首先([^:]+)匹配除:一次或多次之外的所有内容,并且正则表达式这部分周围的括号将其存储为匹配的第一个捕获。

:文字只匹配:a 。

(\S+)匹配除空格以外的所有内容,一次或多次(由于+)和括号使其成为匹配项的第二部分。

\s匹配一个空格,这似乎将您的所有记录分开。

调用regex.findall(str)尝试尽可能多地匹配regexon str。输出是list2 元组的 a,其中每个元组的第一个元素是来自正则表达式的第一个捕获括号的匹配项,第二个元素是来自正则表达式的第二个捕获括号的匹配项。

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

于 2013-10-12T12:48:32.450 回答