<p>我不确定您想要的确切输出类型,但我想我有一个想法,如何使用regex创建一个有用的数据结构,带有<code>'name'</code>和{<cd2>}标记。在</p>
<p>来自repl:</p>
<pre><code>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')]
</code></pre>
<p>要提取名称和ip标记,可以使用<a href="http://docs.python.org/2/tutorial/datastructures.html#list-comprehensions" rel="nofollow">list comprehension</a>:</p>
^{pr2}$
<p>正则表达式</p>
^{3}$
<p>工作原理如下:</p>
<p>首先,<code>([^:]+)</code>匹配除<code>:</code>之外的所有内容一次或多次,正则表达式这一部分周围的括号将其存储为匹配的第一次捕获。在</p>
<p><code>:</code>文本与<code>:</code>匹配。在</p>
<p><code>(\S+)</code>匹配除空格以外的所有内容,一次或多次(由于<code>+</code>),括号使其成为匹配捕获的第二部分。在</p>
<p><code>\s</code>匹配一个空格,这似乎分隔了所有记录。在</p>
<p>调用<code>regex.findall(str)</code>尝试尽可能多次匹配<code>str</code>上的<code>regex</code>。输出是2元组的<code>list</code>,其中每个元组的第一个元素是来自正则表达式的第一个捕获括号的匹配,第二个元素是来自正则表达式的第二个捕获括号的匹配。在</p>
<p>请参见<a href="http://docs.python.org/2/library/re.html" rel="nofollow">http://docs.python.org/2/library/re.html</a>以获取有关Python中regex的更多详细信息。在</p>