Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
用python解析文件名';s-re模块_Python_Regex_Parsing_Filenames - Fatal编程技术网

用python解析文件名';s-re模块

用python解析文件名';s-re模块,python,regex,parsing,filenames,Python,Regex,Parsing,Filenames,我正在开发视频播放器,它可以扫描用户的视频文件,并尝试从文件名中识别它们。如果视频是电影,我想知道它的名称和视频的质量,如果是电视节目,我想知道节目的名称、季号、集号和视频的质量 我在谷歌上搜索了一些示例文件名,制作了一个简单的脚本,试图获取信息,但我真的很难处理例外情况,比如在质量之前有一集的名称,文件有“正确”这样的标签,或者用户在质量之前有“BluRay”这样的视频源 如果有更精通正则表达式的人能提供一些帮助,我将不胜感激 谢谢 重新导入 姓名=[ “The.Newsroom.2012.S

我正在开发视频播放器,它可以扫描用户的视频文件,并尝试从文件名中识别它们。如果视频是电影,我想知道它的名称和视频的质量,如果是电视节目,我想知道节目的名称、季号、集号和视频的质量

我在谷歌上搜索了一些示例文件名,制作了一个简单的脚本,试图获取信息,但我真的很难处理例外情况,比如在质量之前有一集的名称,文件有“正确”这样的标签,或者用户在质量之前有“BluRay”这样的视频源

如果有更精通正则表达式的人能提供一些帮助,我将不胜感激

谢谢

重新导入
姓名=[
“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

然后我