2

正規表現のリストとターゲット フレーズのリストがあります。正規表現の各部分を各フレーズと照合し、リストのリストを返します。行は用語、列は正規表現であり、データは一致オブジェクトまたはのいずれかであり、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 な方法があると思います。

4

1 に答える 1

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]]
于 2013-10-20T16:53:49.217 に答える