正则表达式和重命名fi

2024-06-16 09:52:11 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在编写一个小程序,它可以在一个文件夹中查找具有给定前缀的所有文件,比如说'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()有关


Tags: 文件程序retxt文件夹prefixwithextension
1条回答
网友
1楼 · 发布于 2024-06-16 09:52:11

这里有两个问题:

如果希望newNumber005,则newNumber必须为字符串,因为前两个0在被解释为整数时会被删除

你的下一个问题确实是你的替补。通过使用字符串格式化,您可以有效地创建新的regexp\15\4(请参阅其中的5,这就是您的newNumber)。当python看到这一点时,它会尝试获取捕获组15,而不是group 1,后跟一个文本5。您可以像这样将引用括在g中以获得所需的行为:\g<1>5\4

所以您的代码需要更改为:

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'\g<1>%s\4' % newNumber, 'spam006.txt')

关于\g<n>行为的更多信息可以在^{} doucmentation的末尾找到

相关问题 更多 >