我有大量的文件,试图批量重命名。这些文件名的模式在某种程度上是一致的,但是几乎没有什么障碍使我的基本正则表达式知识不足。
文件名通常是这样的:
1050327473 {913EDD51} 1st Filename [2nd Edition].txt
通过这段代码,我可以删除{}
,[]
和其他一些特殊字符之间的字符串:
new_file_name = re.sub(r'{.+?}', '', filename)
new_file_name = re.sub(r'\[.+?]', '', new_file_name)
new_file_name = ((new_file_name.split(" .pdf", 1)[0]) + '.pdf').translate({ord(i):None for i in '/\:*?"<>|_'})
并成功输出以下内容:
1050327473 1st Filename
但是,某些原始文件名与模式不同,我仍然必须删除10位数字。其他模式很少有这样的:
785723041X, 4844004976 {2C5ACB07} 1st Filename.txt
0383948600 {6A7528B5} 2nd Filename.txt
3263031418, 7966530910, 8070331430 {DCBAD13B} 3rd Filename.txt
预期输出是
1st Filename.txt
2nd Filename.txt
3rd Filename.txt
现在,我可以删除数字字符的每一位,但是文件名也会丢失一部分有意义的部分,并变成st Filename.txt
。用诸如[10:]
之类的字符串数组的某个部分也将不起作用,因为该数字的长度是可互换的。
我认为最合乎逻辑的事情是删除每10位数字字符,但是10位数字序列中的某些序列以X而不是10位数字结尾,例如785723041X
。同样,如果10位数序列后跟逗号,则也应将其删除。
解决此问题的最佳方法是什么?只能使用正则表达式吗?
答案 0 :(得分:2)
使用特定的正则表达式模式:
import re
filenames = ['785723041X, 4844004976 {2C5ACB07} 1st Filename.txt',
'0383948600 {6A7528B5} 2nd Filename.txt',
'3263031418, 7966530910, 8070331430 {DCBAD13B} 3rd Filename.txt']
pat = re.compile(r'\{[^{}]+\}|\[[^[]]+\]|\b\d{9}[\dX],?')
filenames = [pat.sub('', f).strip() for f in filenames]
print(filenames)
输出:
['1st Filename.txt', '2nd Filename.txt', '3rd Filename.txt']
正则表达式详细信息:
..|..|..
-交替组(以匹配多个可能的正则表达式中的单个正则表达式)\{[^{}]+\}
-匹配用{}
括起来的所有字符(它们本身除外,由字符类[^{}]+
确保)\[[^[]]+\]
-匹配用[]
括起来的所有字符(它们本身除外,由字符类[^[]]+
确保)\b\d{9}[\dX],?
-匹配9位数字序列,后跟10位数字或X
字符以及可选的尾随,
字符