-1

pylms python ライブラリに含まれていない関数について、logitech メディア サーバー用の telnet api を使用しています。

リクエストのレスポンスの処理に行き詰まっています。

以下は、単一の文字列としての応答の例です

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(":") タグが2つの単語で構成されている場合、つまりスペースが含まれている場合、これは失敗します。

要約すると、「name:」タグのリストを取得するにはどうすればよいですか?

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''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')]

name タグと 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

次のように動作します:

最初に が1 回以上([^:]+)の以外のすべてに一致し、正規表現のこの部分を括弧で囲んで一致の最初のキャプチャとして保存します。:

:リテラルは単純に a に一致します:

(\S+)は、スペース以外のすべてに 1 回以上 ( による+) 一致し、括弧により、一致によってキャプチャされた 2 番目の部分になります。

\sは、すべてのレコードを区切るように見える単一のスペースに一致します。

呼び出しは、できる限りonregex.findall(str)を一致させようとします。出力は2 タプルで、すべてのタプルの最初の要素は正規表現の最初のキャプチャ括弧からの一致であり、2 番目の要素は正規表現の 2 番目のキャプチャ括弧からの一致です。regexstrlist

Python の正規表現の詳細については、http: //docs.python.org/2/library/re.html を参照してください。

于 2013-10-12T12:48:32.450 に答える