鱼C论坛

 找回密码
 立即注册
查看: 2759|回复: 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个分组里加上?

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

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

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

# Create a regex that matches files with '0' in the filename.
zeroPattern = re.compile(r'^(.*?)(0+)(.*)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

text='sdaa000121sada1.txt'
pattern=re.compile(r'^(.*)(0+)(.+)
是这样么?)
print(pattern.fullmatch(text))
是这样么?你的(.x)是什么意思?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 13:13:27 From FishC Mobile | 显示全部楼层
文件名都啥样,只去掉前面的0吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-10-10 13:43:39 From FishC Mobile | 显示全部楼层
本帖最后由 hrp 于 2020-10-10 13:55 编辑
import re
a = '0db001s.txt'
b = re.sub(r'^0+', '', a)
print(b)
# db001s.txt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

我写错了,应该是*
import re

text = 'sdaa000121sada1.txt'
pattern = re.compile(r'^(.*)(0+)(.+)')
mo = pattern.search(text)
print(mo.group(2))

返回的只匹配了一个0,而不是三个
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


对,比如good002.txt,改为good2.txt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


比如good002.txt,改为good2.txt,这是我想要达到的效果
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

import re

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


print(pattern.fullmatch(text))

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

Process finished with exit code 0

不是都匹配的么?所以你的问题到底什么呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

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

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

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

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

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

    # Rename the files.
    print("Renaming '%s' to '%s'" % (filePath, zeroFilePath))
    #shutil.move(filePath, zeroFilePath) # uncomment after test

我的目的是为了把abd001.txt和agsad01.txt分别改为abd1.txt和agsad1.txt。但是我的代码只能改为abd01.txt和agsad1.txt
想知道小甲鱼最近在做啥?请访问 -> 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上,你打印看下
    beforePart = mo.group(1)
    zeroPart   = mo.group(2)
    afterPart  = mo.group(3)
这三个值是什么。。。。。。。

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

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

# Loop over the files in the working directory.
for filename in os.listdir(r'D:\python\test\1'):
    print(filename)
    mo = zeroPattern.search(filename)
    #Skip file without '0' in the filename.
    if mo == None:
        continue
    zeroFilename=mo.group().replace('0','')
    print(zeroFilename)
    absWorkingDir = os.path.abspath('.')
    filePath      = os.path.join(absWorkingDir + '\\' + filename)
    zeroFilePath  = os.path.join(absWorkingDir + '\\' + zeroFilename)

    # Rename the files.
    print("Renaming '%s' to '%s'" % (filePath, zeroFilePath))
    #shutil.move(filePath, zeroFilePath) # uncomment after test
想知道小甲鱼最近在做啥?请访问 -> 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,这是我想要达到的效果

import re
a = 'good0020.txt'
# 使用先行断言
b = re.sub(r'0+(?=[1-9]+.*\..*$)', '', a)
print(b)
# good20.txt
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

# Loop over the files in the working directory.
for filename in os.listdir(r'D:\python\test\1'):
    print(filename)
    mo = zeroPattern.search(filename)
    #Skip file without '0' in the filename.
    if mo == None:
        continue
    print(mo)
    # Get the different parts of the filename.
    beforePart = mo.group(1)
    zeroPart   = mo.group(2)
    afterPart  = mo.group(3)
    print('1'+beforePart,zeroPart,afterPart)

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

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

    # Rename the files.
    print("Renaming '%s' to '%s'" % (filePath, zeroFilePath))
    #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'
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

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

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

# Create a regex that matches files with '0' in the filename.
zeroPattern = re.compile(r'^(.*?)(0+)(.*)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这三个值是什么 ...

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

使用道具 举报

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

还没学明白断言,看不大懂,
仍然十分感谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

你的原代码:

我好像是明白我哪里搞错了,谢谢!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-18 09:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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