あなたが望む出力のタイプが正確にはわかりませんが、'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 番目のキャプチャ括弧からの一致です。regex
str
list
Python の正規表現の詳細については、http: //docs.python.org/2/library/re.html を参照してください。