我试图将我在Video :: Filename Perl模块中找到的以下Perl正则表达式转换为Python 2.5.4正则表达式来解析文件名
# 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>[^\/]+?))?$',
Run Code Online (Sandbox Code Playgroud)
我也想使用命名组,我在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>[^\/]+?))?$')
Run Code Online (Sandbox Code Playgroud)
我得到的错误:
raise error, v # invalid expression
sre_constants.error: bad character in group name
Run Code Online (Sandbox Code Playgroud)
例如,这个我设法转换,它的工作原理.但上面的那个我似乎无法做对.我在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>[^\/]+?))?$')
Run Code Online (Sandbox Code Playgroud)
我不知道从哪里开始寻找.
您的翻译有两个问题.首先,第二次提到openb它周围有额外的括号,使其成为条件表达式,而不是命名表达式.
接下来是你没有翻译\k<season> 反向引用,Python (P=season)用来匹配相同的反向引用.以下编译对我来说:
r = re.compile(r'^(?:(?P<name>.*?)[\/\s._-]*)?(?P<openb>\[)?(?P<season>\d{1,2})[x\/](?P<episode>\d{1,2})(?:-(?:(?P=season)x)?(?P<endep>\d{1,2}))?(?(openb)\])(?:[\s._-]*(?P<epname>[^\/]+?))?$')
Run Code Online (Sandbox Code Playgroud)
如果我是你,我会使用re.VERBOSE将这个表达式分成多行并添加大量文档,这样你就可以在将来继续理解表达式,如果这是需要保持可维护的东西的话.
(在实现第二个openb引用之后编辑是一个条件表达式,并正确地转换反向引用).
| 归档时间: |
|
| 查看次数: |
995 次 |
| 最近记录: |