1

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

我需要将一个字符串转换为包含file1to的文本file01,但不转换file10file010.

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

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

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

4

3 回答 3

1

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

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

正则表达式101演示

(?<! ... )被称为负回溯。如果模式之后的模式在否定后向匹配中匹配,这将防止(否定)匹配。例如,(?<!a)b将匹配b字符串中的所有内容,除非它a前面有一个,意思是bb匹配cb,但ab不匹配。(?<!\d)(\d)因此匹配一个数字,除非它前面有另一个数字。

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

(?= ... )是一个积极的前瞻。仅当正向先行内的模式在该正向先行之前的模式之后匹配时才匹配。换句话说,只有在字符串后面有 a时a(?=b)才会匹配字符串中的所有内容。匹配,但或不匹配。ababacaa

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

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

于 2013-10-03T05:53:06.920 回答
0

怎么样?

a='file1'    
a='file' + "%02d" % int(a.split('file')[1])
于 2013-10-03T06:01:45.367 回答
0

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

>>> txt = 'file8, file9, file10'
>>> re.sub(r'\d+', lambda m : m.group().zfill(2), txt)
'file08, file09, file10'
于 2013-10-03T06:50:25.973 回答