操作两个列表最简洁的方法,返回python中的列表列表

时间:2013-10-20 16:50:34

标签: python regex list iterator

我有正则表达式列表和目标短语列表。我希望将每个正则表达式与每个短语相匹配,返回列表列表,其中行是术语和列是正则表达式,数据是匹配对象或None,简洁如下可能。我当前的方法做了这种匹配,但不幸的是给了我一个长列表,而不是我描述的列表列表。

这就是我所拥有的:

import re
regexLines=['[^/]*/b/[^/]*', 'a/[^/]*/[^/]*', '[^/]*/[^/]*/c', 'foo/bar/baz', 'w/x/[^/]*/[^/]*', '[^/]*/x/y/z']
targetLines=['/w/x/y/z/', 'a/b/c', 'foo/', 'foo/bar/', 'foo/bar/baz/']

###compiling the regex lines
matchLines=[re.compile(i) for i in regexLines]

matchMatrix=[i.match(j) for i in matchLines for j in targetLines]

matchMatrix
[None, <_sre.SRE_Match object at 0x04095368>, None, None, None, None, <_sre.SRE_Match     object at 0x0411A3D8>, None, None, None, None, <_sre.SRE_Match object at 0x0411A410>, None, None, None, None, None, None, None, <_sre.SRE_Match object at 0x0411A448>, None, None, None, None, None, None, None, None, None, None]

我想要的东西看起来像这样,每行代表一个短语的匹配:

[[None, <_sre.SRE_Match object at 0x04095368>, None, None, None, None], 
[<_sre.SRE_Match object at 0x0411A3D8>, None, None, None, None, <_sre.SRE_Match object at 0x0411A410>], etc. etc.

我可以写出一个可以做我想要的详细循环,但我的暗示是有一种简洁的Pythonic方法来做到这一点。

1 个答案:

答案 0 :(得分:5)

可能是你想要的:

matchMatrix = [[i.match(j) for j in targetLines] for i in matchLines ]

<强>演示:

>>> import pprint
>>> pprint.pprint([[i.match(j) for j in targetLines] for i in matchLines ])
[[None, <_sre.SRE_Match object at 0x9b5d058>, None, None, None],
 [None, <_sre.SRE_Match object at 0x9b5d100>, None, None, None],
 [None, <_sre.SRE_Match object at 0x9b5d138>, None, None, None],
 [None, None, None, None, <_sre.SRE_Match object at 0x9b5d170>],
 [None, None, None, None, None],
 [None, None, None, None, None]]