これを行うための組み込みメソッドはありませんが、リスト内包表記を使用することで期待どおりの結果を得ることができます。
[dict([[k, i if isinstance(i, str) else i[v-1]] for k,v in pat.groupindex.items()]) for i in pat.findall(text)]
わかりやすい書式設定:
>>> [
... dict([
... [k, i if isinstance(i, str) else i[v-1]]
... for k,v in pat.groupindex.items()
... ])
... for i in pat.findall(text)
... ]
findall
リスト内包表記を使用してリストを作成し、文字列のリストまたはタプルのリストのいずれかである結果を反復処理します (0 または 1 つのキャプチャ グループは のリストになりstr
ます)。
結果の各項目に対して、コンパイルされたパターンdict
のフィールドから生成される from another リスト内包表記を構築します。これは次のようになります。groupindex
>>> pat.groupindex
{'name2': 2, 'name': 1}
内の各アイテムに対してリストが作成されgroupindex
、アイテム fromfindall
がタプルの場合、from のグループ番号をgroupindex
使用して正しいアイテムが検索されます。それ以外の場合、アイテムは (現存する) 名前付きグループに割り当てられます。
[k, i if isinstance(i, str) else i[v-1]]
最後に、文字列のリストのリストから辞書が作成されます。
groupindex
には名前付きグループのみが含まれているため、名前のないキャプチャ グループは結果の から省略されることに注意してくださいdict
。
そして結果:
[dict([[k, i if isinstance(i, str) else i[v-1]] for k,v in pat.groupindex.items()]) for i in pat.findall(text)]
[{'name2': 'sue', 'name': 'bob'}, {'name2': 'richard', 'name': 'jon'}]