鱼C论坛

 找回密码
 立即注册
查看: 3234|回复: 16

[已解决]正则表达式匹配字符多个‘0’

[复制链接]
发表于 2020-10-10 12:15:36 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 duke0522 于 2020-10-10 14:13 编辑

我的目的是想把文件名中数字部分前面的‘0’全部去掉,比如,0001.txt改为1.txt。我写的正则表达式re.compile(r'^(.*)(0+)(.*)$'),但是运行的结果却是得到了少了一个‘0’的文件名,001.txt。
各位大神,我的正则表达式有什么问题?
最佳答案
2020-10-10 22:33:28
正则默认贪婪匹配,请在你代码的第1个分组里加上?

你的原代码:
  1. import re, os, shutil

  2. # Create a regex that matches files with '0' in the filename.
  3. zeroPattern = re.compile(r'^(.*)(0+)(.*)
复制代码


将第4行修改为:
  1. import re, os, shutil

  2. # Create a regex that matches files with '0' in the filename.
  3. zeroPattern = re.compile(r'^(.*?)(0+)(.*)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-10-10 12:27:11 | 显示全部楼层
  1. import re

  2. text='sdaa000121sada1.txt'
  3. pattern=re.compile(r'^(.*)(0+)(.+)
  4. 是这样么?)
  5. print(pattern.fullmatch(text))
复制代码

是这样么?你的(.x)是什么意思?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 13:13:27 From FishC Mobile | 显示全部楼层
文件名都啥样,只去掉前面的0吗
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 13:43:39 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-10-10 13:55 编辑
  1. import re
  2. a = '0db001s.txt'
  3. b = re.sub(r'^0+', '', a)
  4. print(b)
  5. # db001s.txt
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 14:14:00 | 显示全部楼层
不知道你的文件名是什么样子的,默认就是你写的这种样子了。
给你两种方法
  1. import re
  2. str1=["0001.txt","0012.txt","1002.txt"]
  3. #第一种方法sub替换
  4. for each in str1:
  5.     print(re.sub(r"^0*","",each))#直接把开头的0去掉就可以了
  6. #第二种方法分组匹配
  7. p=re.compile(r"[0]*(\d*\..+)")#前面的中括号加*是滤掉开头的0。后面的小括号内是你需要的文件名,其中\d*匹配多个数字,\.匹配一个点,最后的 .+ 匹配文件的后缀
  8. for each in str1:
  9.     result=p.match(each)
  10.     print(result.group(1))
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 14:14:00 | 显示全部楼层
疾风怪盗 发表于 2020-10-10 12:27
是这样么?你的(.x)是什么意思?

我写错了,应该是*
  1. import re

  2. text = 'sdaa000121sada1.txt'
  3. pattern = re.compile(r'^(.*)(0+)(.+)')
  4. mo = pattern.search(text)
  5. print(mo.group(2))
复制代码


返回的只匹配了一个0,而不是三个
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 14:14:35 | 显示全部楼层
本帖最后由 duke0522 于 2020-10-10 14:19 编辑
一世长安呢 发表于 2020-10-10 13:13
文件名都啥样,只去掉前面的0吗


对,比如good002.txt,改为good2.txt
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 14:16:42 | 显示全部楼层
本帖最后由 duke0522 于 2020-10-10 14:20 编辑


比如good002.txt,改为good2.txt,这是我想要达到的效果
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 14:17:36 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-10-10 14:24 编辑
duke0522 发表于 2020-10-10 14:14
我写错了,应该是*

  1. import re

  2. text='good00002.txt'
  3. pattern=re.compile(r'^(.*)(0+)(.*)


  4. print(pattern.fullmatch(text))


复制代码


<re.Match object; span=(0, 13), match='good00002.txt'>

Process finished with exit code 0

不是都匹配的么?所以你的问题到底什么呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-10 14:29:40 | 显示全部楼层
疾风怪盗 发表于 2020-10-10 14:17
Process finished with exit code 0

不是都匹配的么?所以你的问题到底什么呢?
  1. import re, os, shutil

  2. # Create a regex that matches files with '0' in the filename.
  3. zeroPattern = re.compile(r'^(.*)(0+)(.*)

  4. 我的目的是为了把abd001.txt和agsad01.txt分别改为abd1.txt和agsad1.txt。但是我的代码只能改为abd01.txt和agsad1.txt)

  5. # Loop over the files in the working directory.
  6. for filename in os.listdir():
  7.     mo = zeroPattern.search(filename)

  8.     # Skip file without '0' in the filename.
  9.     if mo == None:
  10.         continue

  11.     # Get the different parts of the filename.
  12.     beforePart = mo.group(1)
  13.     zeroPart   = mo.group(2)
  14.     afterPart  = mo.group(3)

  15.     # Form the filename without '0'.
  16.     zeroFilename = beforePart + afterPart

  17.     # Get the full, absolute file paths.
  18.     absWorkingDir = os.path.abspath('.')
  19.     filePath      = os.path.join(absWorkingDir + '\\' + filename)
  20.     zeroFilePath  = os.path.join(absWorkingDir + '\\' + zeroFilename)

  21.     # Rename the files.
  22.     print("Renaming '%s' to '%s'" % (filePath, zeroFilePath))
  23.     #shutil.move(filePath, zeroFilePath) # uncomment after test
复制代码


我的目的是为了把abd001.txt和agsad01.txt分别改为abd1.txt和agsad1.txt。但是我的代码只能改为abd01.txt和agsad1.txt
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 14:55:30 | 显示全部楼层
本帖最后由 疾风怪盗 于 2020-10-10 15:00 编辑
duke0522 发表于 2020-10-10 14:29
我的目的是为了把abd001.txt和agsad01.txt分别改为abd1.txt和agsad1.txt。但是我的代码只能改为abd01 ...


你为什么要写这么复杂,正则是没问题的,能找到,问题出在你的group上,你打印看下
  1.     beforePart = mo.group(1)
  2.     zeroPart   = mo.group(2)
  3.     afterPart  = mo.group(3)
复制代码

这三个值是什么。。。。。。。

而且你只要去掉0,为什么不用replace呢?正则其实也用不着的吧。。。。。。。。。
  1. import re, os, shutil

  2. # Create a regex that matches files with '0' in the filename.
  3. zeroPattern = re.compile(r'(.*)(0+)(.*)')

  4. # Loop over the files in the working directory.
  5. for filename in os.listdir(r'D:\python\test\1'):
  6.     print(filename)
  7.     mo = zeroPattern.search(filename)
  8.     #Skip file without '0' in the filename.
  9.     if mo == None:
  10.         continue
  11.     zeroFilename=mo.group().replace('0','')
  12.     print(zeroFilename)
  13.     absWorkingDir = os.path.abspath('.')
  14.     filePath      = os.path.join(absWorkingDir + '\\' + filename)
  15.     zeroFilePath  = os.path.join(absWorkingDir + '\\' + zeroFilename)

  16.     # Rename the files.
  17.     print("Renaming '%s' to '%s'" % (filePath, zeroFilePath))
  18.     #shutil.move(filePath, zeroFilePath) # uncomment after test
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 14:59:36 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-10-10 16:18 编辑
duke0522 发表于 2020-10-10 14:16
比如good002.txt,改为good2.txt,这是我想要达到的效果

  1. import re
  2. a = 'good0020.txt'
  3. # 使用先行断言
  4. b = re.sub(r'0+(?=[1-9]+.*\..*$)', '', a)
  5. print(b)
  6. # good20.txt
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 15:03:30 | 显示全部楼层
duke0522 发表于 2020-10-10 14:29
我的目的是为了把abd001.txt和agsad01.txt分别改为abd1.txt和agsad1.txt。但是我的代码只能改为abd01 ...

按你的写法的话,加个\D试试
  1. import re, os, shutil

  2. # Create a regex that matches files with '0' in the filename.
  3. zeroPattern = re.compile(r'(.\D*)(0+)(.*)')

  4. #我的目的是为了把abd001.txt和agsad01.txt分别改为abd1.txt和agsad1.txt。但是我的代码只能改为abd01.txt和agsad1.txt)

  5. # Loop over the files in the working directory.
  6. for filename in os.listdir(r'D:\python\test\1'):
  7.     print(filename)
  8.     mo = zeroPattern.search(filename)
  9.     #Skip file without '0' in the filename.
  10.     if mo == None:
  11.         continue
  12.     print(mo)
  13.     # Get the different parts of the filename.
  14.     beforePart = mo.group(1)
  15.     zeroPart   = mo.group(2)
  16.     afterPart  = mo.group(3)
  17.     print('1'+beforePart,zeroPart,afterPart)

  18.     # Form the filename without '0'.
  19.     zeroFilename = beforePart + afterPart

  20.     # Get the full, absolute file paths.
  21.     absWorkingDir = os.path.abspath('.')
  22.     filePath      = os.path.join(absWorkingDir + '\\' + filename)
  23.     zeroFilePath  = os.path.join(absWorkingDir + '\\' + zeroFilename)

  24.     # Rename the files.
  25.     print("Renaming '%s' to '%s'" % (filePath, zeroFilePath))
  26.     #shutil.move(filePath, zeroFilePath) # uncomment after test
复制代码


abd001.txt
<re.Match object; span=(0, 10), match='abd001.txt'>
1abd 00 1.txt
Renaming 'D:\python\test\abd001.txt' to 'D:\python\test\abd1.txt'
agsad01.txt
<re.Match object; span=(0, 11), match='agsad01.txt'>
1agsad 0 1.txt
Renaming 'D:\python\test\agsad01.txt' to 'D:\python\test\agsad1.txt'
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 22:33:28 | 显示全部楼层    本楼为最佳答案   
正则默认贪婪匹配,请在你代码的第1个分组里加上?

你的原代码:
  1. import re, os, shutil

  2. # Create a regex that matches files with '0' in the filename.
  3. zeroPattern = re.compile(r'^(.*)(0+)(.*)
复制代码


将第4行修改为:
  1. import re, os, shutil

  2. # Create a regex that matches files with '0' in the filename.
  3. zeroPattern = re.compile(r'^(.*?)(0+)(.*)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-11 11:00:13 | 显示全部楼层
疾风怪盗 发表于 2020-10-10 14:55
你为什么要写这么复杂,正则是没问题的,能找到,问题出在你的group上,你打印看下

这三个值是什么 ...

这个方法确实更简单,但是我还是想搞清楚为什么正则表达式哪里有问题,altf11解答了这个问题。
不过仍然非常感谢你
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-11 11:02:09 | 显示全部楼层

还没学明白断言,看不大懂,
仍然十分感谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-11 11:02:49 | 显示全部楼层
altf11 发表于 2020-10-10 22:33
正则默认贪婪匹配,请在你代码的第1个分组里加上?

你的原代码:

我好像是明白我哪里搞错了,谢谢!
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-28 03:28

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表