我正在编写一个重命名文件的脚本。在这种情况下,有三种可能性。
1.file不存在:创建新文件
2.文件存在:使用文件名'(文件出现次数)创建新文件。例如filename(1)
3.文件的重复已存在:创建文件名为'(文件出现次数)'的新文件。例如filename(2)
我在字符串中有文件名。我可以使用正则表达式检查文件名的最后一个字符但是如何检查'('到')'中的最后一个字符并获取其中的数字?
答案 0 :(得分:2)
你只需要这样的东西:
(?<=\()(\d+)(?=\)[^()]*$)
说明:
(?<=\()
必须以文字(
(\d+)
匹配并捕获数字(?=\)[^()]+$)
必须后跟)
,然后不再是(
或)
,直到字符串结尾。示例:如果文件名为Foo (Bar) Baz (23).jpg
,则上面的正则表达式匹配23
答案 1 :(得分:0)
以下是基于现有文件名获取文件名的代码和测试:
import re
def get_name(filename, existing_names):
exist = False
index = 0
p = re.compile("^%s(\((?P<idx>\d+)\))?$" % filename)
for name in existing_names:
m = p.match(name)
if m:
exist = True
idx = m.group('idx')
if idx and int(idx) > index:
index = int(idx)
if exist:
return "%s(%d)" % (filename, index + 1)
else:
return filename
# test data
exists = ["abc(1)", "ab", "abc", "abc(2)", "ab(1)", "de", "ab(5)"]
tests = ["abc", "ab", "de", "xyz"]
expects = ["abc(3)", "ab(6)", "de(1)", "xyz"]
print exists
for name, exp in zip(tests, expects):
new_name = get_name(name, exists)
print "%s -> %s" % (name, new_name)
assert new_name == exp
查看此行的正则表达式以获取(*)
中的数字:
p = re.compile("^%s(\((?P<idx>\d+)\))?$" % filename)
此处它使用命名的捕获?P<idx>\d+
作为数字\d+
,稍后使用m.group('idx')
访问捕获。