我是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))
有人可以告诉我我的模式和替换有什么问题并给我一些建议吗?
答案 0 :(得分:1)
您可以在添加0之前捕获数字并检查长度,但您可能可以使用此代码:
import re
txt = 'file8, file9, file10'
pat = r"(?<!\d)(\d)(?=,|$)"
regexp = re.compile(pat)
print(regexp.sub(r"0\1", txt))
(?<! ... )
被称为负面的后视。如果匹配后的模式具有负后观匹配中的模式,则可以防止(负)匹配。例如,(?<!a)b
将匹配字符串中的所有b
,除非它前面有a
,表示bb
,cb
匹配,但是{{ 1}}不匹配。 ab
因此匹配一个数字,除非它之前有另一个数字。
(?<!\d)(\d)
是一个数字,包含在一个捕获组中,用简单的括号表示。捕获的组将存储在第一个捕获组中。
(\d)
是一个积极的前瞻。如果正前瞻中的模式与此前瞻性前的模式匹配,则仅匹配 。换句话说,只有在(?= ... )
后面有a(?=b)
时,a
才会匹配字符串中的所有b
。 ab
匹配,但ac
或aa
不匹配。
(?=,|$)
是一个正向前瞻,包含,|$
,表示逗号或字符串的结尾。
(?<!\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'