Python字符串清理

时间:2011-10-06 18:59:49

标签: python regex pyqt

我在PyQT中编写一个程序,需要使用凌乱的字符串并清理它们。可能的输入值变化很大。例如,我想采取字符串:

"Seven_Pounds_(BDrip_1080p_ENG-ITA-GER)_Multisub_x264_bluray_.mkv",  
"The_Birds_1963_HDTV_XvidHD_720p-NPW.avi",  
"1892.XVID.AC3.HD.120_min.avi"  

并将它们变成:
    “七磅”,
    “鸟类”,
    “1892”

我已经考虑过使用re来转义表达式,但是这个方法似乎很可能在最后一个例子中失败了。程序Media Gerbil使用google diff-match-patch算法来处理字符串清理。这似乎是一个更好的选择,但我不知道如何实现它。 是否有另一种更有效的方法来清理Python / PyQt中的字符串,还是正则表达式或差异匹配补丁是最佳路径?

5 个答案:

答案 0 :(得分:2)

从diff-match-patch的外观来看,匹配最接近你所说的,在我看来它可能不是最好的解决方案,因为匹配显然想要找到特定的模式(不是正则表达式规则)?

我认为您可能想要定义一系列正则表达式规则,例如下划线被视为单词之间的空格,以及任何非[a-zA-Z0-9 _] +可能表示标题的结尾。您必须至少假设您的标题从字符串的开头开始,然后模式匹配,直到达到“非单词”字符。

也许是这样的?

rx = re.compile(r'([a-zA-Z\d_]+[a-zA-Z\d])[_.]?')

但遗憾的是,正如另一个答案中提到的那样,没有办法真正处理“The Birds 1963”。我认为解决方案是假设标题应该从哪里开始并且可能停止的组合,并且可以删除常见标签列表。

修改 - 考虑更多信息

也许一旦你已经缩小了你的潜在头衔就可以得到它,那么你可以做一个google diff-match-patch对抗imdb.com中的API搜索,找到最接近真实游戏的匹配

答案 1 :(得分:2)

基于您的示例:

import re

a="The_Birds_1963_HDTV_XvidHD_720p-NPW.avi"
b="Seven_Pounds_(BDrip_1080p_ENG-ITA-GER)_Multisub_x264_bluray_.mkv"
c="1892.XVID.AC3.HD.120_min.avi"

def cleanit(str):
    result = []
    l = re.split('[_.]',str)
    flag = 0
    if re.match('^[a-zA-z]+',l[0]):
        flag = 1
    elif re.match('^[0-9]+',l[0]):
        flag = 2

    if flag == 1:
        for x in l:
            if not re.match('^[a-zA-Z]+',x):
                break;
            result.append(x) 
        return " ".join(result)

    if flag == 2:
        for x in l:
            if not re.match('^[0-9]+',x):
                break;
            result.append(x) 
        return " ".join(result)

if __name__ == '__main__':
    print cleanit(a)
    print cleanit(b)
    print cleanit(c)

将打印:

kent$  python cleanit.py
The Birds
Seven Pounds
1892

答案 2 :(得分:2)

我实际上曾经这样做过......你基本上按照一系列步骤

  • 消除[],()或{}
  • 中的任何内容
  • 删除文件扩展名
  • 现在拆分为[\ s。-_]

在你的情况下,你会得到:

Seven Pounds Multisub x264 bluray
The Birds 1963 HDTV XvidHD 720p NPW
1892 XVID AC3 HD 120 min

现在,您在查看之前基本上会保留一个要从列表中清除的单词列表。这个例子中显而易见的是x264,Multisub,蓝光,HDTV,XvidHD,Xvid,HD,720p,1040p,AC3。请注意,您需要在此处进行不区分大小写的比较。

请注意,此列表将在您浏览集合时手动展开,并且会留下

Seven Pounds
The Birds 1963
1892 120 min

这可能与半自动系统一样好。上述方法之一会告诉你清除前面没有出现的数字,但是我会指出你会搞乱“玩具总动员2”之类的东西。

就我而言,我做了上述处理,然后试图找出哪些目录模式与档案相匹配。然后我有一个基于curses的界面,允许我滚动并手动纠正脚本的结论(包括重命名)。

编辑:第二个想法,我的脚本实际上假设可以安全地删除第二个数字集(以及之后的所有内容)。这些都是启发式的,你遇到异常。添加该步骤会将最后一个示例标题更正为1892

答案 3 :(得分:1)

从示例来看,无论技术如何,它看起来都会非常棘手。程序应该如何知道1963不是中间电影的标题的一部分?也许你最好的选择是拥有一个首字母缩略词列表,然后从第一个匹配的首字母缩略词和前进中截断字符串。它会让你The Birds 1963来处理,但我真的没有办法解决这个问题。

答案 4 :(得分:0)

用下划线,空格,圆点切割。

过滤掉明显的部分,例如 x264 BDRip multisub

在IMDB中查询名称中包含以下单词的电影:)