我在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中的字符串,还是正则表达式或差异匹配补丁是最佳路径?
答案 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)
我实际上曾经这样做过......你基本上按照一系列步骤
在你的情况下,你会得到:
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中查询名称中包含以下单词的电影:)