私はファイルタイプを変換するパッケージをハッキングしており、ユーザーが変換(Python関数)とファイル名の変更方法の正規表現を指定できるようにしています。
あるケースでは、一連の正規表現と単一の出力文字列があり、すべての正規表現グループの結合で拡張したいと考えています。
import re
re_strings = ['(.*).txt', '(.*).ogg', 'another(?P<name>.*)']
regexes = map(re.compile, re_strings]
input_files = ['cats.txt', 'music.ogg', 'anotherpilgrim.xls']
matches = [regexes[i].match(input_files[i]) for i in range(len(regexes))]
outputstr = 'Text file about: \1, audio file about: \2, and another file on \g<name>.'
# should be 'Text file about: cats, audio file about: music, and another file on pilgrim.xls'
正規表現を結合して拡張したいと思いoutputstr
ます(おそらく、参照には連結の方が理にかなってい\2
ますか?)。reを連結して、未使用の文字で区切ることができます。
final_re = re.compile('\n'.join(re_strings))
final_files = '\n'.join(input_files)
match = final_re.search(final_files)
ただし、これにより、ファイル名の一部だけでなく、ファイル全体と一致するようになります。私はファイルの間にキャッチオールグループを入れることができます(.*?)
が、それは確かにグループ参照を台無しにし、元のパターンを台無しにする可能性があります(私は制御できません)。名前付きグループをどこにでも強制して、すべての正規表現.groupdict()を結合することもできると思います。
Pythonは部分的な拡張を許可しないため、すべてのグループ参照が有効である必要があるため、次のようにgroupdictに対して一連の拡張を行う可能性はありません。
for m in matches:
outputstr = m.expand(outputstr)
アドバイスありがとうございます!