使用正则表达式替换命令在文件名字符串中小于 10 的数字前面插入前导零

Posted

技术标签:

【中文标题】使用正则表达式替换命令在文件名字符串中小于 10 的数字前面插入前导零【英文标题】:using regular expression substitution command to insert leading zeros in front of numbers less than 10 in a string of filenames 【发布时间】:2013-08-14 00:55:36 【问题描述】:

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

text = 'file1, file2, file10, file20'

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

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

但它不起作用

【问题讨论】:

【参考方案1】:

您可以将re.substr.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'

【讨论】:

谢谢!但是我的字符串中有其他文件名,比如file100?我只想要一个前导零【参考方案2】:

你可以使用:

re.sub('[a-zA-Z]\d,', lambda x: x.group(0)[0] + '0' + x.group(0)[1:], s)

【讨论】:

我使用的搜索模式'[a-zA-Z]\d,'返回一个len()=3的字符串,re.sub()方法允许你通过调用一个函数来使用这个字符串作为第二个参数,这使得使用匹配字符串中的值构建复杂的替换变得非常容易。您应该refer here 了解更多详细信息和示例... 这部分我不太清楚:x.group(0)[0] + '0' + x.group(0)[1:] 对于每个匹配它找到一个可以使用group(0)访问的组,包含三个字符'e1,''e2,',然后我通过切片[0]-->'e'[1:]-->'1,' or '2,'来使用这些字符重建字符串以替换原来的... 知道了!很好的解决方案 所以等等,实际上,为什么零只会被添加到单个数字?抱歉,我是 python 新手【参考方案3】:

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

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

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

【讨论】:

当我尝试这个并尝试打印 mtch 时,它给了我一个空白列表:【参考方案4】:

你已经应用了开始和结束锚点,所以模式不能完全匹配。

试试这样的

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

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

说明

(?&lt;=[a-z]) - 使用后视检查前面的字符是否为字母

\d - 匹配单个数字

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

,? - 允许在列表中使用可选逗号

0\g&lt;0&gt; - 模式匹配单个数字,因此添加零很简单。 \g&lt;0&gt; 是匹配组。

【讨论】:

以上是关于使用正则表达式替换命令在文件名字符串中小于 10 的数字前面插入前导零的主要内容,如果未能解决你的问题,请参考以下文章

rename命令中正则表达式的使用

用一个实例讲解rename命令中正则表达式的使用

如何在 perl 正则表达式替换命令中使用 unicode 字符?

Java 正则表达式,替换图片,替换数字,和谐用语,复制文件

如何在 VBScript 中使用正则表达式替换部分子字符串?

正则表达式(sedawk)