使用正则表达式在python中用数字数字替换连续符号

时间:2016-03-01 04:12:21

标签: python regex

情况如下:

str='myfile.#.#####-########.ext'

我想用#替换#:456 所以它应该是:

str = 'myfile.456.00456-00000456.ext'

第二种情况:

str= 'myfile.%012d.tga'

用数字456替换模式,使其变为:

str= 'myfile.000000000456.tga'

我可以通过抓取模式使用字符串替换方法来解决这个问题,然后计算数字然后填充零填充。现在,我想知道如何在python中使用正则表达式?有人可以帮忙吗?非常感谢。

3 个答案:

答案 0 :(得分:3)

第二种情况是直接的,不需要正则表达式,正则表达式就是一种矫枉过正。我建议你使用字符串格式替换

'myfile.%012d.tga' % 456
Out[21]: 'myfile.000000000456.tga'

第一种情况很棘手但可能

>>> def repl(m):
    return "{{0:0{}}}".format(len(m.group(1)))

>>> re.sub(r"(#+)", repl, st).format(456)
'myfile.456.00456-00000456.ext'

答案 1 :(得分:0)

通过没有format功能的re.sub。

>>> s = 'myfile.#.#####-########.ext'
>>> re.sub(r'#+', lambda m: '456' if len(m.group()) == 1 else m.group()[:-1].replace('#', '0') + '456', s)
'myfile.456.0000456-0000000456.ext'

对于第二种情况,

>>> s = 'myfile.%012d.tga'
>>> re.sub(r'%(\d+)d', lambda m: str('0' * int(m.group(1)))[:-1] + '456', s)
'myfile.00000000000456.tga'

答案 2 :(得分:0)

最后,感谢所有回答我问题的人。那个'lambda'的东西让我想到了,这就是我的问题的答案:

我的第一个案例是使用'#':

s = 'myfile.##.####.########.ext'
print re.sub('#+', lambda x : '456'.zfill(len(x.group())) ,s)

---> myfile.456.0456.00000456.ext

我使用%0xd格式的第二种情况:

s = 'myfile.%06d--%012d--%02d.ext'
print re.sub('%0[0-9]+d', lambda x : x.group() % 456 ,s)

r---> myfile.000456--000000000456--456.ext

这里只是以上两种情况的简单组合:

s = 'myfile.##.####.########.%06d---%02d.ext'
x=re.sub('#+', lambda x : '456'.zfill(len(x.group())) ,s)
print re.sub('%0[0-9]+d', lambda x : x.group() % 456 ,x)

---> myfile.456.0456.00000456.000456---456.ext

不要忘记'import re'来使用正则表达式。