5

我无法弄清楚如何使用替换命令来完成这项工作,这是我被指示要做的。我将此文本用作变量:

text = 'file1, file2, file10, file20'

我想搜索文本并在任何小于 10 的数字前面替换零。我想我可以做 if 语句,具体取决于 re.match 或 findall 是否会在文本后面找到一个数字,但我可以似乎没有执行。这是我的起始代码,我试图将字符串和数字提取到组中,并且只提取那些只有一位数字的文件名:

import re
text = 'file1, file2, file10, file20'
mtch = re.findall('^([a-z]+)(\d{1})$',text)

但它不起作用

4

4 回答 4

3

您可以re.sub使用str.zfill

>>> text = 'file1, file2, file10, file20'
>>> re.sub(r'(\d+)', lambda m : m.group(1).zfill(2), text)
'file01, file02, file10, file20'
#or
>>> re.sub(r'([a-z]+)(\d+)', lambda m : m.group(1)+m.group(2).zfill(2), text)
'file01, file02, file10, file20'
于 2013-08-12T16:13:00.033 回答
1

锚点锚定到字符串(或行,在多行模式下)的开头和结尾。您正在寻找的是单词边界。当然,你不需要{1}量词。

\b([a-z]+)(\d)\b

(不确定你打算如何使用你的捕获,所以我会不理会这些。)

于 2013-08-12T16:11:40.853 回答
1

您可以使用:

re.sub('[a-zA-Z]\d,', lambda x: x.group(0)[0] + '0' + x.group(0)[1:], s)
于 2013-08-12T16:16:48.253 回答
0

您应用了开始和结束锚点,因此无法完全匹配模式。

尝试这样的事情

text = "file1, file2, file3, file4, file10, file20, file100"
print re.sub("(?<=[a-z])\d(?!\d),?", "0\g<0>", text)

将导致

file01, file02, file03, file04, file10, file20, file100

如果您有上面的列表或单个元素名称,这应该可以工作。

解释

(?<=[a-z])- 检查前面的字符是使用后视的字母

\d- 匹配单个数字

(?!\d)- 使用前瞻检查是否没有更多数字

,?- 允许列表中的可选逗号

0\g<0>- 模式匹配单个数字,因此添加零很简单。是\g<0>匹配组。

于 2013-08-12T17:33:57.710 回答