正则表达式 (re.search) 无法检测错误
Regular expression (re.search) is unable to detect errors
我正在尝试使用 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']
到目前为止,我无法找到错误或找到任何替代解决方案。
问题是正则表达式总是在它找到的第一个匹配项上触发。由于 csv reader 返回格式类似于 "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})
我正在尝试使用 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']
到目前为止,我无法找到错误或找到任何替代解决方案。
问题是正则表达式总是在它找到的第一个匹配项上触发。由于 csv reader 返回格式类似于 "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})