Python 使用正则表达式处理文件数据引言正文引言Python 的正则表达式是非常强大的字符串处理库之前作者很少处理数据以至于对这个库的研究甚少最近处理数据时遇到了一些问题特此记录一下实现方法。正文比如我们有这样一组文件数据且它们均存放在一个文件夹目录下面。如果我们直接获取它们的名称字符串信息并且循环读取我们会发现它们的读取顺序会发生变化。比如frompathlibimportPath olderPath(rD:\D06_PROJECTS\DataProcessing\Codes)iffolder.exists():l3_files[pforpinfolder.glob(*.csv)ifL3inp.name]print(l3_files) Result: [WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_1.00_.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_10.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_100.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_1000.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_2.00_.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_5.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_50.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_500.00.csv)] 可以看到此时文件的排布顺序是杂乱无章的并不是我们想要的顺序我们想要文件按照 L3 的数值从小到大进行排列。正确的做法如下frompathlibimportPathdefget_l3_value(p:Path):matchre.search(rL3_(\d\.?\d*),p.name)returnfloat(match.group(1))ifmatchelsefloat(inf)folderPath(rD:\D06_PROJECTS\DataProcessing\Codes)iffolder.exists():l3_files[pforpinfolder.glob(*.csv)ifL3inp.name]l3_files_sortedsorted(l3_files,keyget_l3_value)print(l3_files_sorted) result: [WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_1.00_.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_2.00_.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_5.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_10.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_50.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_100.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_500.00.csv), WindowsPath(D:/D06_PROJECTS/DataProcessing/Codes/abcd_L3_1000.00.csv)] 可以看到此时我们实现了正确的文件排列顺序。这里我们对一些重要的语句进行说明。l3_files [p for p in folder.glob(*.csv) if L3 in p.name]将所有包含L3的.csv文件选取出来keyget_l3_value: key 排序前对每个l3_files中的元素执行get_l3_value函数操作返回的结果仍旧使用l3_files中的原始元素对应名称排序。match.group(1)表示第一个组里捕获的内容即对应的1.00,2.00,5.00等等match.group(0)表示整个匹配到的内容。因为我们在匹配中加入了()引入了一个组。如果去掉这个括号使用match.group(1)就会报错。使用括号对正则表达式进行分组的用法需要谨记。float(match.group(1))将获取到的字符串转换为浮点数否则排列时仍旧按照字符串排序将无法获取我们想要的排序方式。