【发布时间】:2017-11-10 07:38:37
【问题描述】:
我正在尝试使用 windows 上的 pyhton 重命名文件夹中所有以相同字符串 (Vertragshandbuch_Beitrag_) 开头的一些文件。
一个示例文件名: Vertragshandbuch_Beitrag_004_Term Sheet.docx
新文件名应如下所示:4.docx
我当前的代码如下所示:
import os
import re
for filename in os.listdir("."):
m = re.match("Vertragshandbuch_Beitrag_(\d+)_(\w+(\W\w+)*)\.docx", filename)
number = m.group(1)
new_filename = number + ".docx"
os.rename(filename, new_filename)
print(new_filename)
我收到此错误: 回溯(最近一次通话最后): 文件“C:(...)rename.py”,第 6 行,在 数字 = m.group(1) AttributeError:“NoneType”对象没有属性“组”
我在这里用几个文件名检查了正则表达式:https://regex101.com/,它总是完美匹配。
我是 python 新手,在问这个问题之前我搜索了很长时间,所有关于规范化文件名的提示都没有帮助。
我将输入后的脚本从 blurp 更改为:
import os
import re
for filename in os.listdir("."):
m = re.match(r'Vertragshandbuch_Beitrag_(\d+)_(\w+(\W\w+)*)\.docx', filename)
number = m.group(1)
new_filename = number + ".docx"
os.rename(filename, new_filename)
print(new_filename)
当我检查正则表达式时仍然是相同的错误并且仍然匹配。
测试我现在使用的正则表达式匹配:
import os
import re
for filename in os.listdir("."):
m = re.match(r'Vertragshandbuch_Beitrag_(\d+)_(\w+(\W\w+)*)\.docx', filename)
number = m.group(1)
new_filename = number + ".docx"
if m is not None:
os.rename(filename, new_filename)
print(new_filename)
还是一样的错误信息。
好的,作为最后的手段,我在一个只包含文件 Vertragshandbuch_Beitrag_003_Letter.docx 的文件夹中尝试了这个:
import os, sys
import re
for filename in os.listdir("."):
m = re.match(r"Vertragshandbuch_Beitrag_(\d+)_(\w+(\W\w+)*)\.docx", filename)
print(m)
我得到以下结果: <_sre.sre_match span="(0," match="Vertragshandbuch_Beitrag_003_Letter.docx">
看起来是匹配的,但仍然是错误。
【问题讨论】:
-
re.match()在您的正则表达式不匹配时返回None。您可以通过if m is not None进行检查。此外,您需要在正则表达式模式前加上r前缀,例如r"xyz",否则\d之类的东西将不起作用。有关详细信息,请参阅redocs。 -
我将您的正则表达式(
r''版本)和示例文件名复制到一个小脚本中,它对我有用。目录中的所有文件是否都与模式匹配?如果没有,您必须检查None。 -
我也在尝试插入 None 测试,但我总是会得到无效的语法。我试过了:
-
if m is not None os.rename(filename, new_filename) print(new_filename) -
None后面好像少了一个冒号。