我写了一个脚本来标准化使用(主要是)r.sub从数据库提取的一堆值。我很难合并zfill来填充5位数字的数值。
输入
FOO5864BAR654FOOBAR
所需的输出
FOO_05864-BAR-00654_FOOBAR
使用到目前为止的re.sub
FOO_5864-BAR-654_FOOBAR
一种选择是对每种可能的格式进行re / sub捕获组[即下面],该方法有效,但我认为这不是正确的方法。
(\d) sub 0000\1
(\d\d) sub 000\1
(\d\d\d) sub 00\1
(\d\d\d\d) sub 0\1
答案 0 :(得分:0)
假设您输入的所有内容均为字母-数字-字母-数字-字母形式(每个字母一个或多个),则只需将匹配项中的第二组和第四组填为零即可。
import re
s = 'FOO5864BAR654FOOBAR'
pattern = r'(\D+)(\d+)(\D+)(\d+)(\D+)'
m = re.match(pattern, s)
out = '{}_{:0>5}-{}-{:0>5}_{}'.format(*m.groups())
print(out) # -> FOO_05864-BAR-00654_FOOBAR
您也可以使用str.zfill(5)
来做到这一点,但是str.format
方法更加简洁。