使用正则表达式替换命令在文件名字符串中小于 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.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'
【讨论】:
谢谢!但是我的字符串中有其他文件名,比如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
如果您有上述列表或单个元素名称,这应该可以工作。
说明
(?<=[a-z])
- 使用后视检查前面的字符是否为字母
\d
- 匹配单个数字
(?!\d)
- 使用前瞻检查是否没有更多数字
,?
- 允许在列表中使用可选逗号
0\g<0>
- 模式匹配单个数字,因此添加零很简单。 \g<0>
是匹配组。
【讨论】:
以上是关于使用正则表达式替换命令在文件名字符串中小于 10 的数字前面插入前导零的主要内容,如果未能解决你的问题,请参考以下文章
如何在 perl 正则表达式替换命令中使用 unicode 字符?
Java 正则表达式,替换图片,替换数字,和谐用语,复制文件