用python解析文件名';s-re模块
我正在开发视频播放器,它可以扫描用户的视频文件,并尝试从文件名中识别它们。如果视频是电影,我想知道它的名称和视频的质量,如果是电视节目,我想知道节目的名称、季号、集号和视频的质量 我在谷歌上搜索了一些示例文件名,制作了一个简单的脚本,试图获取信息,但我真的很难处理例外情况,比如在质量之前有一集的名称,文件有“正确”这样的标签,或者用户在质量之前有“BluRay”这样的视频源 如果有更精通正则表达式的人能提供一些帮助,我将不胜感激 谢谢用python解析文件名';s-re模块,python,regex,parsing,filenames,Python,Regex,Parsing,Filenames,我正在开发视频播放器,它可以扫描用户的视频文件,并尝试从文件名中识别它们。如果视频是电影,我想知道它的名称和视频的质量,如果是电视节目,我想知道节目的名称、季号、集号和视频的质量 我在谷歌上搜索了一些示例文件名,制作了一个简单的脚本,试图获取信息,但我真的很难处理例外情况,比如在质量之前有一集的名称,文件有“正确”这样的标签,或者用户在质量之前有“BluRay”这样的视频源 如果有更精通正则表达式的人能提供一些帮助,我将不胜感激 谢谢 重新导入 姓名=[ “The.Newsroom.2012.S
重新导入
姓名=[
“The.Newsroom.2012.S02E06.720p.HDTV.x264 KILLERS.mkv”,
“破碎。坏。S05E10。掩埋。HDTV。XviD AFG.avi”,
“Breaking.Bad.S05E10.burned.720p.HDTV.x264 AFG.mkv”,非高清
“Dexter.S08E08.HDTV.XviD AFG.avi”,
“Dexter.S08E07.1080p.HDTV.x264 QCF.mkv”,
“Dexter S08E07 720p高清电视x264 QCF.mkv”,
“The.Great.Gatsby.2013.BluRay.1080p.DTS.x264 CHD.mkv”
“禁地女孩2013 BRRIP Xvid AC3-BHRG.avi”,
“痛苦与收获2013.720p.BluRay.DD5.1.x264 HiDt.mkv”,
“兄弟乐队.S01E02.天的.天的.DVDRip.XviD-AC3-BAGS.avi”,
“Dexter.S08E06.property.720p.HDTV.x264 IMMERSE.mkv”,非高清
“Dexter S08E06标准720p HDTV x264浸入式.mkv”#非高清
]
对于名称中的名称:
tv=re.findall(r“(.*?[|.]S([\d+]{1,2})E([\d+]{1,2})[\124;.]([\ d+]{3,4}p |),name)#FIXME:在“适当的/EPTITLE/”之后也获得质量
如果镜头(电视)>0:
打印(“--------------电视-----------------”)
打印(“显示:+tv[0][0]。替换(“.,”))
打印(“季节:+str(int(tv[0][1]))
打印(“插曲:+str(int(tv[0][2]))
打印(“质量:+(电视[0][3]如果len(电视[0][3])>0否则为“非高清”))
其他:
movie=re.findall(r“(.?[|][\d+]{4})[|]([\d+]{3,4}p})”,name)#FIXME:在“BluRay/HDTV/HDDVD/”之后也可以获得质量
如果len(电影)>0:
打印(“-----------电影-----------------”)
打印(“标题:+电影[0][0]。替换(“.”,“”))
打印(“质量:+(电影[0][1]如果len(电影[0][1])>0否则为“非高清”))
其他:
打印(“错误”)
如果使用re.VERBOSE标志分解正则表达式,可能会有所帮助
我明白了
[\d+]{3,4}
我认为这是误导。这不是意味着“至少有一个小数点重复三到四次”吗?我想
很好
在开发正则表达式时,我从创建小模式开始:
episode_pattern = re.compile(r"S\d+E\d+", re.IGNORECASE)
希望有帮助。如果使用re.VERBOSE标志分解正则表达式,可能会有所帮助 我明白了
[\d+]{3,4}
我认为这是误导。这不是意味着“至少有一个小数点重复三到四次”吗?我想
很好
在开发正则表达式时,我从创建小模式开始:
episode_pattern = re.compile(r"S\d+E\d+", re.IGNORECASE)
希望能有所帮助。正如Josh提到的,
+
限定符不应该与{m,n}
一起使用+
匹配一个或多个re,而{m,n}
贪婪地匹配m到n个重复。(见:)
他还提出了一个很好的观点来帮助你的正则表达式的可读性
编辑:(感谢@eyguem指出这一点)我可能错了,但您的[|.]
是试图匹配空格和句点?如果是这样,您就不需要|
,而且转义特殊字符(如
)可能是一个好习惯。(即[\.]
)
如果您知道季/集和质量之间的字符串是字母、空格或句点,则可以使用类似的内容(编辑:如果存在诸如“-”、“+”等非字母字符,则需要将它们添加到字符集中):
同样,您可以对电影部分执行以下操作:
movie = re.findall(r"""(.*?[ .]\d{4}) # Title including year
[ .a-zA-Z]* # Space, period, or words
(\d{3,4}p)? # Quality
""", name, re.VERBOSE)
这是输出:
---------- TV ----------
Show: The Newsroom 2012
Season: 2
Episode: 6
Quality: 720p
---------- TV ----------
Show: Breaking Bad
Season: 5
Episode: 10
Quality: nonHD
---------- TV ----------
Show: Breaking Bad
Season: 5
Episode: 10
Quality: 720p
---------- TV ----------
Show: Dexter
Season: 8
Episode: 8
Quality: nonHD
---------- TV ----------
Show: Dexter
Season: 8
Episode: 7
Quality: 1080p
---------- TV ----------
Show: Dexter
Season: 8
Episode: 7
Quality: 720p
--------- MOVIE --------
Title: The Great Gatsby 2013
Quality: 1080p
--------- MOVIE --------
Title: The Forbidden Girl 2013
Quality: nonHD
--------- MOVIE --------
Title: Pain & Gain 2013
Quality: 720p
---------- TV ----------
Show: Band of Brothers
Season: 1
Episode: 2
Quality: nonHD
---------- TV ----------
Show: Dexter
Season: 8
Episode: 6
Quality: 720p
---------- TV ----------
Show: Dexter
Season: 8
Episode: 6
Quality: 720p
正如Josh提到的,
+
限定符不应该与{m,n}
一起使用+
匹配一个或多个re,而{m,n}
贪婪地匹配m到n个重复。(见:)
他还提出了一个很好的观点来帮助你的正则表达式的可读性
编辑:(感谢@eyguem指出这一点)我可能错了,但您的[|.]
是试图匹配空格和句点?如果是这样,您就不需要|
,而且转义特殊字符(如
)可能是一个好习惯。(即[\.]
)
如果您知道季/集和质量之间的字符串是字母、空格或句点,则可以使用类似的内容(编辑:如果存在诸如“-”、“+”等非字母字符,则需要将它们添加到字符集中):
同样,您可以对电影部分执行以下操作:
movie = re.findall(r"""(.*?[ .]\d{4}) # Title including year
[ .a-zA-Z]* # Space, period, or words
(\d{3,4}p)? # Quality
""", name, re.VERBOSE)
这是输出:
---------- TV ----------
Show: The Newsroom 2012
Season: 2
Episode: 6
Quality: 720p
---------- TV ----------
Show: Breaking Bad
Season: 5
Episode: 10
Quality: nonHD
---------- TV ----------
Show: Breaking Bad
Season: 5
Episode: 10
Quality: 720p
---------- TV ----------
Show: Dexter
Season: 8
Episode: 8
Quality: nonHD
---------- TV ----------
Show: Dexter
Season: 8
Episode: 7
Quality: 1080p
---------- TV ----------
Show: Dexter
Season: 8
Episode: 7
Quality: 720p
--------- MOVIE --------
Title: The Great Gatsby 2013
Quality: 1080p
--------- MOVIE --------
Title: The Forbidden Girl 2013
Quality: nonHD
--------- MOVIE --------
Title: Pain & Gain 2013
Quality: 720p
---------- TV ----------
Show: Band of Brothers
Season: 1
Episode: 2
Quality: nonHD
---------- TV ----------
Show: Dexter
Season: 8
Episode: 6
Quality: 720p
---------- TV ----------
Show: Dexter
Season: 8
Episode: 6
Quality: 720p
[ae*6]
表示一个字符。这意味着此字符可以是a
、e
、*
或6
那么就没有必要写
[|]
,顺便说一句,它的意思是“字符要么是
,要么是
,要么是
”
我做了一些改进。如果你有问题,尽管问我
注意:像这样的部分:(?:[.])(\d{3}\d?p)|\Z)
在*?
必须强制惰性点*?
转到下一个点,然后是720p,如果有,不要在第一个点停止,并且考虑到数字和p是可选的。如果没有这样的720p,懒惰点将一直移动到字符串的末尾(
\Z
强制它这样做),并声明它没有找到任何720p
import re
names = [
"The.Newsroom.2012.S02E06.720p.HDTV.x264-KILLERS.mkv",
"Breaking.Bad.S05E10.Buried.HDTV.XviD-AFG.avi",
"Trekking.Bad.S05E12.Buried.720p.HDTV.x264-AFG.mkv",
"Dexter.S08E08.HDTV.XviD-AFG.avi",
"Dexter.S08E07.1080p.HDTV.x264-QCF.mkv",
"Dexter S08E07 720p HDTV x264-QCF.mkv",
"The.Great.Gatsby.2013.BluRay.1080p.DTS.x264-CHD.mkv",
"The Forbidden Girl 2013 BRRIP Xvid AC3-BHRG.avi",
"Pain.&.Gain.2013.720p.BluRay.DD5.1.x264-HiDt.mkv",
"Band.of.Brothers.S01E02.Day.of.Days.DVDRip.XviD-AC3-BAGS.avi",
"Dexter.S08E06.PROPER.720p.HDTV.x264-IMMERSE.mkv",
"Dexter S08E06 PROPER 720p HDTV x264-IMMERSE.mkv"
]
regtv = re.compile('(.+?)'
'[ .]S(\d\d?)E(\d\d?)'
'.*?'
'(?:[ .](\d{3}\d?p)|\Z)?')
regmovie = re.compile('(.*?[ .]\d{4})'
'.*?'
'(?:[ .](\d{3}\d?p)|\Z)?')
for name in names:
tv = regtv.match(name)
if tv:
print("---------- TV ----------\n"
"Show: %s\n"
"Season: %s\n"
"Episode: %s\n"
"Quality: %s" %
(tv.group(1).replace(".", " "),
tv.group(2),
tv.group(3),
tv.group(4) if tv.group(4) else "nonHD")
)
else:
movie = regmovie.match(name)
if movie:
print("--------- MOVIE --------\n"
"Title: %s\n"
"Quality: %s" %
(movie.group(1).replace(".", " "),
movie.group(2) if movie.group(2) else "nonHD")
)
else:
print("----- error for -----\n%s" % name)
[ae*6]
表示一个字符。这意味着此字符可以是a
、e
、*
或6
然后我