我不确定您想要的输出类型,但我想我知道如何使用正则表达式创建有用的数据结构,并带有'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)
尝试尽可能多地匹配regex
on str
。输出是list
2 元组的 a,其中每个元组的第一个元素是来自正则表达式的第一个捕获括号的匹配项,第二个元素是来自正则表达式的第二个捕获括号的匹配项。
有关 Python 中正则表达式的更多详细信息,请参阅http://docs.python.org/2/library/re.html。