python实现修改固定模式的字符串内容操作示例
本文实例讲述了python实现修改固定模式的字符串内容操作。分享给大家供大家参考,具体如下:
说明
字符串模式是开头可能有空格,之后可能存在多个小数点,然后后面跟着一个数字,数字可能是小数,数字后可能存在空格。
任务要求删去开头的小数点,如下:
"…78"修改为"78"
"…7.889"修改为"7.889"
“.9.8"修改为"9.8”
代码示例
注意这里正则的模式和分组的用法
importos importre testStr=r"...7.88" pattern=re.compile(r'(?P*)(?P \.*)(?P \d+\.?\S*)(?P *)') finalStr=pattern.search(testStr) print(finalStr) result=finalStr.group("lblank")+finalStr.group("realcontent")+finalStr.group("rblank") print("resultis:{}".format(result))
输出:
<_sre.SRE_Matchobject;span=(0,8),match='...7.88'>
resultis:7.88
拓展
说明
用来处理样本用的。标签是一个txt文件包含了图片的内容,内容的模式是(空格*)+(.*)+(小数或者整数)+(空格凑齐位数)。
脚本实现功能是:将第二部分里面的小数点去除(用正则分组去),修正原本的标签文件,并将标签两边占位用的空格去掉,形成新的标签,将新标签文件和对应的图片移动到以标签长度命名的文件夹中。由于文件量有40w+,使用多进程处理。
拓展代码
importos
importre
frommultiprocessingimportPool
importshutil
defgetAllFilePath(pathFolder,filter=[".jpg",".txt"]):
#遍历文件夹下所有图片
allCropPicPathList=[]
allTXTPathList=[]
#maindir是当前搜索的目录subdir是当前目录下的文件夹名file是目录下文件名
formaindir,subdir,file_name_listinos.walk(pathFolder):
forfilenameinfile_name_list:
apath=os.path.join(maindir,filename)
ext=os.path.splitext(apath)[1]#返回扩展名
ifext==filter[0]and('_crop'infilename):
allCropPicPathList.append(apath)
elifext==filter[1]and('_crop'infilename):
allTXTPathList.append(apath)
returnlist(zip(allCropPicPathList,allTXTPathList))
#分析样本对模式错误(即删去在开头空格和数字之间的.)的进行修正
defcheckTxtContent(txtcontent,txtPath):
pattern=re.compile(r'(?P*)(?P\.*)(?P\d+\.?\S*)(?P*)')
finalStr=pattern.search(txtcontent)
iflen(finalStr.group("point"))!=0:
resultStr=finalStr.group("lblank")+finalStr.group("realcontent")+finalStr.group("rblank")
withopen(txtPath,'w')asfw:
fw.write(resultStr)
withopen(r'E:\Numberdata\wrong.txt','a')asfw:
fw.write(txtPath+"\n")
print(txtPath,"iswrong!")
returnresultStr
else:
returntxtcontent
#移动图片到对应长度的文件夹标签label进行修改
defdealSampleList(samplePathList,saveBaseDir):
forsamplePathinsamplePathList:
txtPath=samplePath[1]
picPath=samplePath[0]
newtxtStr=""
withopen(txtPath,'r')asfr:
txtStr=fr.readline()
newtxtStr=checkTxtContent(txtStr,txtPath)
newtxtStr=newtxtStr.strip()
#创建对应的文件夹
saveDir=os.path.join(saveBaseDir,str(len(newtxtStr)))
ifnotos.path.exists(saveDir):
os.mkdir(saveDir)
newTxtName=os.path.basename(txtPath)
newPicName=os.path.basename(picPath)
withopen(os.path.join(saveDir,newTxtName),'w')asfw:
fw.write(newtxtStr)
shutil.move(picPath,os.path.join(saveDir,newPicName))
#print(newPicName,'isdone!')
if__name__=='__main__':
allFilePath=getAllFilePath(r'E:\Numberdata\4')
#dealSampleList(allFilePath,r'E:\Numberdata\data')
n_total=len(allFilePath)
n_process=4#8线程
#每段子列表长度
length=float(n_total)/float(n_process)
indices=[int(round(i*length))foriinrange(n_process+1)]
sublists=[allFilePath[indices[i]:indices[i+1]]foriinrange(n_process)]
#生成进程池
p=Pool(n_process)
foriinsublists:
print("sublistlenis{}".format(len(i)))
p.apply_async(dealSampleList,args=(i,r'E:\Numberdata\data'))
p.close()
p.join()
print("Alldone!")
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python字符串操作技巧汇总》、《Python数据结构与算法教程》、《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。