我正在编写一个小程序,它可以在一个文件夹中查找具有给定前缀的所有文件,比如说'spam'
,并查找编号中的空白,然后重命名后续文件夹以填补空白。下面演示了程序的一部分,该部分使用正则表达式定位文件并对其重命名:
prefix = 'spam'
newNumber = 005
# Regex for finding files with specified prefix + any numbering + any file extension
prefixRegex = re.compile(r'(%s)((\d)+)(\.[a-zA-Z0-9]+)' % prefix)
# Rename file by keeping group 1 (prefix) and group 4 (file extension),
# but substituting numbering with newNumber
newFileName = prefixRegex.sub(r'\1%s\4' % newNumber, 'spam006.txt')
我期望从上面得到的是spam005.txt
,但我得到的却是@5.txt
我发现我可以用r'%s%s\4' % (prefix, newNumber)
来代替,然后它确实按预期工作,但我想了解为什么会发生这种错误。它是否与%s
期间使用的re.compile()
有关
这里有两个问题:
如果希望
newNumber
为005
,则newNumber
必须为字符串,因为前两个0
在被解释为整数时会被删除你的下一个问题确实是你的替补。通过使用字符串格式化,您可以有效地创建新的regexp
\15\4
(请参阅其中的5
,这就是您的newNumber
)。当python看到这一点时,它会尝试获取捕获组15
,而不是group 1
,后跟一个文本5
。您可以像这样将引用括在g
中以获得所需的行为:\g<1>5\4
所以您的代码需要更改为:
关于} doucmentation 的末尾找到
\g<n>
行为的更多信息可以在^{相关问题 更多 >
编程相关推荐