繁体   English   中英

如何将具有命名组的Perl正则表达式转换为Python?

[英]How can I convert a Perl regex with named groups to Python?

我正在尝试将我在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>[^\/]+?))?$',

我也想使用命名组,而且我知道在Python中,命名组的regex扩展名是不同的,但是我不确定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

例如,我设法将其转换并成功运行。 但是上面的那个我似乎无法正确理解。 我在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>[^\/]+?))?$')

我不确定从哪里开始寻找。

您的翻译有2个问题。 首先,对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>[^\/]+?))?$')

如果您是我,我将使用re.VERBOSE将表达式分解成多行并添加大量文档,以便将来如果需要保持可维护性,您可以继续理解该表达式。

(在实现第二个openb引用后进行编辑是一个条件表达式,并正确转换了反向引用)。

我找到了令人讨厌的部分,但是如果不全神贯注,就无法弄清楚到底是什么问题。

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>)\]) // this part here causes the error message

(?:[\s._-]*(?P<epname>[^\/]+?))?$')

问题似乎在于python中的组名必须是有效的python标识符(请参阅文档 )。 括号似乎是问题所在。 删除它们给

(?(P<openb>)\]) //with parentheses
(?P<openb>\])   //without parentheses

redefinition of group name 'openb' as group 6; was group 2

那些正则表达式是一个病态的人的产物... :-)

无论如何,(?())都是Python和Perl中的条件,并且上面的perl语法看起来应该与Python语法相同,即,它对存在的组的评估为true。

从哪里开始寻找? 这些模块的文档在这里:

http://docs.python.org/library/re.html http://www.perl.com/doc/manual/html/pod/perlre.html

我可能是错的,但您尝试使用来获取反向引用:

(?:\k<season>x)

Python中的语法\\g<name>不是吗?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM