正则表达式使用替换来转换数字

时间:2013-10-03 05:48:05

标签: python regex substitution

我是Python初学者,所以请记住我的正则表达式技能是-122级。

我需要将包含file1的文字的字符串转换为file01,但不能将file10转换为file010

我的程序错了,但这是我能得到的最接近的,我已经尝试了几十种组合,但我无法接近:

import re
txt = 'file8, file9, file10'
pat = r"[0-9]"
regexp = re.compile(pat)
print(regexp.sub(r"0\d", txt))

有人可以告诉我我的模式和替换有什么问题并给我一些建议吗?

3 个答案:

答案 0 :(得分:1)

您可以在添加0之前捕获数字并检查长度,但您可能可以使用此代码:

import re
txt = 'file8, file9, file10'
pat = r"(?<!\d)(\d)(?=,|$)"
regexp = re.compile(pat)
print(regexp.sub(r"0\1", txt))

regex101 demo

(?<! ... )被称为负面的后视。如果匹配后的模式具有负后观匹配中的模式,则可以防止(负)匹配。例如,(?<!a)b将匹配字符串中的所有b,除非它前面有a,表示bbcb匹配,但是{{ 1}}不匹配。 ab因此匹配一个数字,除非它之前有另一个数字。

(?<!\d)(\d)是一个数字,包含在一个捕获组中,用简单的括号表示。捕获的组将存储在第一个捕获组中。

(\d)是一个积极的前瞻。如果正前瞻中的模式与此前瞻性前的模式匹配,则仅匹配 。换句话说,只有在(?= ... )后面有a(?=b)时,a才会匹配字符串中的所有bab匹配,但acaa不匹配。

(?=,|$)是一个正向前瞻,包含,|$,表示逗号或字符串的结尾。

(?<!\d)(\d)(?=,|$)因此匹配任何数字,只要它之前没有数字并且后面有逗号,或者该数字位于字符串的末尾。

答案 1 :(得分:0)

怎么样?

a='file1'    
a='file' + "%02d" % int(a.split('file')[1])

答案 2 :(得分:0)

此方法使用正则表达式查找每个数字序列,str.zfill用零填充:

>>> txt = 'file8, file9, file10'
>>> re.sub(r'\d+', lambda m : m.group().zfill(2), txt)
'file08, file09, file10'