正则表达式(搜索)无法检测错误

2024-10-01 00:32:20 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图使用re.search检测CSV文件中的数据错误,其中不正确的数据(与给定模式不匹配)将发送到一个列表(错误),而正确的数据(与模式匹配)将发送到另一个列表(干净)

以下是数据在CSV文件中的外观:

UES9151GS5  DEN PEK
UES915*GS5  JFK FCO
WYu2010YH8  ORD CAN
HCA3158QA6  ORD ~AN
HCA3158QA6  KUL A;S
HCA3158QA6  0   LHR
HCA3158QA6  A;S ORD
HCA3158QA6  ~AN PVG

这是我的代码:

import csv
import re

clean = []
error = []

pid_pattern = '[A-Z]{3}[0-9]{4}[A-Z]{2}[0-9]'
dept_pattern = '[A-Z]{3}'
arr_pattern = '[A-Z]{3}'

with open(r"test.csv") as csvfile:
    reader = csvfile
    for i in reader:
        pid = re.search(pid_pattern, i)
        dept = re.search(dept_pattern, i)
        arr = re.search(arr_pattern, i)
        
        if pid !=None and dept != None and arr != None:
             clean.append(i)
        elif pid == None:
            error.append(i)
        elif dept == None:
            error.append(i)
        elif arr == None:
            error.append(i)

因此,在运行代码后,我得到:

clean
['UES9151GS5,DEN,PEK\n',
 'HCA3158QA6,ORD,~AN\n',
 'HCA3158QA6,A;S,A;S,\n',
 'HCA3158QA6,0,LHR\n',
 'HCA3158QA6,A;S,ORD\n',
 'HCA3158QA6,~AN,PVG\n']
error
['UES915*GS5,JFK,FCO\n',
 'WYu2010YH8,ORD,CAN\n']

显然,代码只检查第一列(pid),而忽略其余的。预期结果应如下所示:

clean
['UES9151GS5,DEN,PEK\n']
error
['HCA3158QA6,ORD,~AN\n',
 'HCA3158QA6,A;S,A;S,\n',
 'HCA3158QA6,0,LHR\n',
 'HCA3158QA6,A;S,ORD\n',
 'HCA3158QA6,~AN,PVG\n',
 'UES915*GS5,JFK,FCO\n',
 'WYu2010YH8,ORD,CAN\n']

到目前为止,我无法找到错误或找到任何替代解决方案


Tags: 数据recleannoneansearch错误error
1条回答
网友
1楼 · 发布于 2024-10-01 00:32:20

问题是正则表达式总是在找到第一个匹配时触发。由于csv读取器返回的行的格式类似于“PID,DEPT,ARR”,这意味着如果PID中有格式[A-Z]{3},它将找到匹配的行。为了防止出现这种情况,可以将列分开并搜索与列对应的每个部分上的正则表达式(我不知道如何做),或者更改正则表达式

import csv
import re

clean = []
error = []

pid_pattern = '[A-Z]{3}[0-9]{4}[A-Z]{2}[0-9],.+,.+' // only look at the first column
dept_pattern = '.+,[A-Z]{3},.+' // only look at second column
arr_pattern = '.+,.+[A-Z]{3}' // only look at third column

with open(r"test.csv") as csvfile:
    reader = csvfile
    for i in reader:
        pid = re.search(pid_pattern,i)
        dept = re.search(dept_pattern,i)
        arr = re.search(arr_pattern,i)

        if pid !=None and dept != None and arr != None:
             clean.append(i)
        elif passenger_id == None:
            error.append(i)
        elif departure == None:
            error.append(i)
        elif arrival == None:
            error.append(i)

或者您可以将整个正则表达式组合成一个[A-Z]{3}[0-9]{4}[A-Z]{2}[0-9],[A-Z]{3},[A-Z]{3}

用于使用匹配和组捕获的正则表达式([A-Z]{3}[0-9]{4}[A-Z]{2}[0-9]),([A-Z]{3}),([A-Z]{3})

相关问题 更多 >