<p>使用<code>zip</code>函数和基于<a href="http://www.regular-expressions.info/lookaround.html" rel="nofollow">positive look-ahead</a>的正则表达式:</p>
<pre><code>>>> s="""James Earl Carter, Jr., 1977-1981, Democrat
... Ronald Wilson Reagan, 1981-1989, Republican
... George Herbert Walker Bush, 1989-1993, Republican"""
>>>
>>> list(zip(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')]))
[('Carter', 'Reagan', 'Bush'),
('1977', '1981', '1989'),
('1981', '1989', '1993'),
('Democrat', 'Republican', 'Republican')]
</code></pre>
<p>以下正则表达式:</p>
<pre><code>r'\w+(?=[,-]|$)'
</code></pre>
<p>将找到位于<code>,</code>或<code>-</code>之前或位于字符串末尾的任何单词字符组合</p>
<p>如果您处理的是较长的列表,我建议您使用<a href="https://docs.python.org/2/library/itertools.html#itertools.izip_longest" rel="nofollow">^{<cd4>}</a>,这对于此类问题更为合适,而且在列表的列数不相同时也很好。它还接受<code>fillvalue</code>参数来填充缺少的列:</p>
<pre><code>>>> s="""James Earl Carter, Jr., 1977-1981, Democrat,anothername,12222
... Ronald Wilson Reagan, 1981-1989, Republican,33453
... George Herbert Walker Bush, 1989-1993, Republican"""
>>> from itertools import zip_longest
>>> list(zip_longest(*[re.findall(r'\w+(?=[,-]|$)',i) for i in s.split('\n')],fillvalue='**'))
[('Carter', 'Reagan', 'Bush'),
('1977', '1981', '1989'),
('1981', '1989', '1993'),
('Democrat', 'Republican', 'Republican'),
('anothername', '33453', '**')]
>>>
</code></pre>
<p>请注意,在这两种情况下,如果要迭代<code>izip_longest</code>或<code>zip</code>的结果,则不需要调用<code>list</code>,这只是为了演示结果</p>