枚举字符串中的数字

时间:2014-06-18 15:23:14

标签: python string replace enumeration

这似乎是一个相当直接的答案的问题;遗憾的是,我还没有流利的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,但那没关系。到目前为止,这两个答案都是完美的。我可以根据自己的需要调整它们。我已经掌握了完整的路径,但是对于那些将来会看到这一点的人来说,这很棒。谢谢大家:)

2 个答案:

答案 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.txtos.path.split诀窍。

更新:修复了丢失的路径分隔符

.splitext

答案 1 :(得分:0)

以下是基于str.lstripstr.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'填充;和
  • 仅支持前导填充;

但你可以采取这种做法,并根据自己的目的进行调整。