名前付きグループを持つPerl正規表現をPythonに変換するにはどうすればよいですか?
# Perl > v5.10
re => '^(?:(?<name>.*?)[\/\s._-]*)?(?<openb>\[)?(?<season>\d{1,2})[x\/](?<episode>\d{1,2})(?:-(?:\k<season>x)?(?<endep>\d{1,2}))?(?(<openb>)\])(?:[\s._-]*(?<epname>[^\/]+?))?$',
ファイル名を解析するためのPython 2.5.4正規表現に私はVideo::Filename Perlモジュールで見つかった以下のPerlの正規表現を変換しようとしています
私も名前のグループを使用したい、と私はPythonで知っています名前付きグループの正規表現の拡張は異なりますが、私は構文について100%確信していません。
これは私が試したものです:
# Python (not working)
r = re.compile(r'^(?:(?P<name>.*?)[\/\s._-]*)?(?P<openb>\[)?(?P<season>\d{1,2})[x\/](?P<episode>\d{1,2})(?:-(?:\kP<season>x)?(?P<endep>\d{1,2}))?(?(P<openb>)\])(?:[\s._-]*(?P<epname>[^\/]+?))?$')
エラーが私が取得:
raise error, v # invalid expression
sre_constants.error: bad character in group name
は、例えば、この1つは私が変換するために管理し、それが動作します。しかし、私は上記のものが正しいとは思えません。私はPythonでコンパイルエラーが発生します。
# Perl:
re => '^(?:(?<name>.*?)[\/\s._-]+)?(?:s|se|season|series)[\s._-]?(?<season>\d{1,2})[x\/\s._-]*(?:e|ep|episode|[\/\s._-]+)[\s._-]?(?<episode>\d{1,2})(?:-?(?:(?:e|ep)[\s._]*)?(?<endep>\d{1,2}))?(?:[\s._]?(?:p|part)[\s._]?(?<part>\d+))?(?<subep>[a-z])?(?:[\/\s._-]*(?<epname>[^\/]+?))?$',
# Python (working):
r = re.compile(r'^(?:(?P<name>.*?)[\/\s._-]+)?(?:s|se|season|series)[\s._-]?(?P<season>\d{1,2})[x\/\s._-]*(?:e|ep|episode|[\/\s._-]+)[\s._-]?(?P<episode>\d{1,2})(?:-?(?:(?:e|ep)[\s._]*)?(?P<endep>\d{1,2}))?(?:[\s._]?(?:p|part)[\s._]?(?P<part>\d+))?(?P<subep>[a-z])?(?:[\/\s._-]*(?P<epname>[^\/]+?))?$')
どこから探し始めるかわかりません。
Hmm Perlでは\は、以前に定義された名前付きグループへの逆参照を意味するので、その正規表現(この場合)は同じ正規表現で2回の名前を持つことになります。 –
ああ、そうだ。その後、それを(?P = name)参照に変換する必要があると私は考える。更新中。 –
まあ、perlreのマニュアルページには、名前付きパターンやそれらの後方参照はまったく言及されておらず、私は今は間に合いませんので、読者のための練習として残しておきます。 –