Python正则表达式修改固定模式字符串内容示例
本文介绍如何使用Python正则表达式处理特定模式的字符串,即去除开头空格与数字间多余的小数点。通过分组匹配提取有效内容,实现字符串清洗。此外,针对包含40万+样本的大规模数据集,文章展示了利用多进程Pool结合文件遍历与路径操作,批量修正标签文件并移动图片至对应文件夹的完整方案。
本文通过具体实例,讲解如何利用Python修改符合特定模式的字符串内容,供读者参考学习。
说明
目标字符串的模式特征为:起始部分可能包含若干空格,随后可能出现多个小数点,接着是一个数字(该数字可以是整数或浮点数),数字末尾可能跟随若干空格。
任务核心要求是移除起始位置的小数点,具体转换效果如下所示:
" …78 " 修改为" 78 " " …7.889 " 修改为" 7.889 " “.9.8"修改为"9.8”
代码示例
请注意正则表达式中模式定义与分组捕获的具体用法。
import os
import re
testStr=r"...7.88 "
pattern=re.compile(r'(?P<lblank> *)(?P<point>\.*)(?P<realcontent>\d+\.?\S*)(?P<rblank> *)')
finalStr=pattern.search(testStr)
print(finalStr)
result=finalStr.group("lblank")+finalStr.group("realcontent")+finalStr.group("rblank")
print("result is: {}".format(result))
输出结果如下:
<_sre.SRE_Match object; span=(0, 8), match='...7.88 '> result is: 7.88
拓展
说明
此方法主要用于处理训练样本数据。标签文件为TXT格式,记录了图片内容,其数据模式遵循:(零个或多个空格)+(零个或多个小数点)+(整数或浮点数)+(用于补齐位数的空格)。
脚本旨在执行以下功能:利用正则表达式分组机制去除第二部分中的小数点,修正原始标签文件,并剔除标签两侧用于占位的空格以生成新标签。随后,将新标签文件及对应的图片移动至以标签数值命名的文件夹中。鉴于数据量超过40万条,程序采用多进程方式进行处理。
拓展代码
import os
import re
from multiprocessing import Pool
import shutil
def getAllFilePath(pathFolder,filter=[".jpg",".txt"]):
#遍历文件夹下所有图片
allCropPicPathList=[]
allTXTPathList=[]
#maindir是当前搜索的目录 subdir是当前目录下的文件夹名 file是目录下文件名
for maindir,subdir,file_name_list in os.walk(pathFolder):
for filename in file_name_list:
apath=os.path.join(maindir,filename)
ext=os.path.splitext(apath)[1]#返回扩展名
if ext==filter[0] and ('_crop' in filename):
allCropPicPathList.append(apath)
elif ext==filter[1] and ('_crop' in filename):
allTXTPathList.append(apath)
return list(zip(allCropPicPathList,allTXTPathList))
#分析样本 对模式错误(即删去在开头空格和数字之间的.)的进行修正
def checkTxtContent(txtcontent,txtPath):
pattern=re.compile(r'(?P<lblank> *)(?P<point>\.*)(?P<realcontent>\d+\.?\S*)(?P<rblank> *)')
finalStr=pattern.search(txtcontent)
if len(finalStr.group("point"))!=0:
resultStr=finalStr.group("lblank")+finalStr.group("realcontent")+finalStr.group("rblank")
with open(txtPath,'w') as fw:
fw.write(resultStr)
with open(r'E:\Numberdata\wrong.txt','a') as fw:
fw.write(txtPath+"\n")
print(txtPath,"is wrong!")
return resultStr
else:
return txtcontent
#移动图片到对应长度的文件夹 标签label进行修改
def dealSampleList(samplePathList,saveBaseDir):
for samplePath in samplePathList:
txtPath=samplePath[1]
picPath=samplePath[0]
newtxtStr=""
with open(txtPath,'r') as fr:
txtStr=fr.readline()
newtxtStr=checkTxtContent(txtStr,txtPath)
newtxtStr=newtxtStr.strip()
# 创建对应的文件夹
saveDir=os.path.join(saveBaseDir,str(len(newtxtStr)))
if not os.path.exists(saveDir):
os.mkdir(saveDir)
newTxtName=os.path.basename(txtPath)
newPicName=os.path.basename(picPath)
with open(os.path.join(saveDir,newTxtName),'w') as fw:
fw.write(newtxtStr)
shutil.move(picPath,os.path.join(saveDir,newPicName))
# print(newPicName,'is done!')
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)) for i in range(n_process+1)]
sublists=[allFilePath[indices[i]:indices[i+1]] for i in range(n_process)]
#生成进程池
p=Pool(n_process)
for i in sublists:
print("sublist len is {}".format(len(i)))
p.apply_async(dealSampleList, args=(i,r'E:\Numberdata\data'))
p.close()
p.join()
print("All done!")
更多关于Python相关内容感兴趣的读者可查看本站专题:《Python字符串操作技巧汇总》、《Python数据结构与算法教程》、《Python列表(list)操作技巧总结》、《Python编码操作技巧总结》、《Python函数使用技巧总结》及《Python入门与进阶经典教程》
希望本文所述对大家Python程序设计有所帮助。
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













