这似乎是一个相当直接的答案的问题;遗憾的是,我还没有流利的Python,因为我还在学习,而且我还没有找到任何有用的东西。
我的目标是根据该数字已经有多少填充来枚举字符串中的数字。我认为描述它的最佳方式是一个例子:
0-file
将从0-file
枚举到9-file
000-file
将从000-file
枚举到999-file
。最终我希望能够为[number][a-z]
,[a-z][number]
和[a-z][number].*
执行此操作(因此file10name.so
之类的内容不匹配),但我认为我以后可以用正则表达式来解决这个问题。
所以,问题归结为:
zfill
,但我感兴趣的是有更好的方法)。快速编辑:是的,'psudo正则表达式'就是这样。它是为了传达这个概念,因此它不符合“ - ”这样的东西。 padding总是一个数字,不一定是0,但那没关系。到目前为止,这两个答案都是完美的。我可以根据自己的需要调整它们。我已经掌握了完整的路径,但是对于那些将来会看到这一点的人来说,这很棒。谢谢大家:)
答案 0 :(得分:0)
在编码之前,您应该为您尝试匹配的文件找出正确的规范。您为要匹配的文件名(" [number][a-z]
或[a-z][number]
")提供的伪正则表达式甚至不包含您提供的示例,例如{ {1}}。
但是,假设您希望包含大写拉丁字母,请按照您所说明的面值,这里是一个与0-file
或[number][a-z]
匹配的简单函数,并返回相应的前缀,后缀和数字位数。
[a-z][number]
输出将是:
import re
def find_number_in_filename(fn):
m = re.match(r"(\d+)([A-Za-z]+)$", fn)
if m:
prefix, suffix, num_length = "", m.group(2), len(m.group(1))
return prefix, suffix, num_length
m = re.match(r"([A-Za-z]+)(\d+)$", fn)
if m:
prefix, suffix, num_length = m.group(1), "", len(m.group(2))
return prefix, suffix, num_length
return fn, "", 0
example_fn = ("000foo", "bar14", "baz0", "file10name")
for fn in example_fn:
prefix, suffix, num_length = find_number_in_filename(fn)
if num_length == 0:
print "%s: does not match" % fn
else:
print "%s -> %s[%d-digits]%s" % (fn, prefix, num_length, suffix)
all_numbered_versions = [("%s%0"+str(num_length)+"d%s") % (prefix, ii, suffix) for ii in range(0,10**num_length)]
print "\t", all_numbered_versions[0], "through", all_numbered_versions[-1]
请注意,我使用标准000foo -> [3-digits]foo
000foo through 999foo
bar14 -> bar[2-digits]
bar00 through bar99
baz0 -> baz[1-digits]
baz0 through baz9
file10name: does not match
字符串格式将数字转换为0填充字符串,例如printf
用于带有0填充的3位数字。使用较新的str.format
可能更适合未来验证。
如果您的输入包含完整路径和带扩展名的文件名(例如%03d
),并且您希望仅根据路径的最后一段进行匹配,请使用/home/someone/project/foo000.txt
和os.path.split
诀窍。
更新:修复了丢失的路径分隔符
.splitext
答案 1 :(得分:0)
以下是基于str.lstrip
和str.format
的生成器实现。它将输入解析为标准字符串模板(例如'{0:02d}-file'
),然后遍历适当的值并使用该模板创建输出:
def process(s):
zeros = len(s) - len(s.lstrip('0'))
template = "{{0:0{0}d}}{1}".format(zeros, s.lstrip('0'))
for i in range(10**zeros):
yield template.format(i)
使用示例:
>>> list(process('00-file'))
['00-file', '01-file', '02-file', ..., '98-file', '99-file']
它有以下限制:
'0'
填充;和但你可以采取这种做法,并根据自己的目的进行调整。