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



我是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,这意味着bbcb匹配,但ab不匹配。 因此,(?<!d)(d)匹配一个数字,除非它前面有另一个数字。

(d) 是一个数字,括在捕获组中,用简单的括号表示。捕获的组存储在第一个捕获组中。

(?= ... )是一个积极的展望。仅当正前瞻中的模式在此正前瞻之前的模式之后匹配时,这才匹配。换句话说,仅当字符串后面有b时,a(?=b)才会匹配字符串中的所有aab匹配,但acaa没有。

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

因此,(?<!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'

最新更新