我是Python初学者,所以请记住我的正则表达式技能是-122级。
我需要将包含file1
文本的字符串转换为file01
,但不要将file10
转换为file010
。
我的程序是错误的,但这是我能得到的最接近的,我已经尝试了几十种组合,但我无法接近:
import re
txt = 'file8, file9, file10'
pat = r"[0-9]"
regexp = re.compile(pat)
print(regexp.sub(r"0d", txt))
有人可以告诉我我的模式和替换有什么问题,并给我一些建议吗?
您可以在添加 0 之前捕获数字并检查长度,但您可以改用它:
import re
txt = 'file8, file9, file10'
pat = r"(?<!d)(d)(?=,|$)"
regexp = re.compile(pat)
print(regexp.sub(r"01", txt))
正则表达式101演示
(?<! ... )
被称为消极的回望。如果模式之后的模式在负后视中具有匹配匹配,这将防止(负(匹配。例如,(?<!a)b
将匹配字符串中的所有b
,除非它前面有一个a
,这意味着bb
、cb
匹配,但ab
不匹配。 因此,(?<!d)(d)
匹配一个数字,除非它前面有另一个数字。
(d)
是一个数字,括在捕获组中,用简单的括号表示。捕获的组存储在第一个捕获组中。
(?= ... )
是一个积极的展望。仅当正前瞻中的模式在此正前瞻之前的模式之后匹配时,这才匹配。换句话说,仅当字符串后面有b
时,a(?=b)
才会匹配字符串中的所有a
。 ab
匹配,但ac
或aa
没有。
(?=,|$)
是一个积极的前瞻,包含,|$
表示逗号或字符串末尾。
因此,(?<!d)(d)(?=,|$)
匹配任何数字,只要它前面没有数字,后面有一个逗号,或者如果该数字在字符串的末尾。
怎么样?
a='file1'
a='file' + "%02d" % int(a.split('file')[1])
这种方法使用正则表达式来查找每个数字序列,并str.zfill
用零填充:
>>> txt = 'file8, file9, file10'
>>> re.sub(r'd+', lambda m : m.group().zfill(2), txt)
'file08, file09, file10'