簡體   English   中英

正則表達式(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 閱讀器返回格式為“PID,DEPT,ARR”的行,這意味着如果 PID 中有格式 [AZ]{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)

或者您可以將整個正則表達式組合成一個[AZ]{3}[0-9]{4}[AZ]{2}[0-9],[AZ]{3},[AZ]{3}

使用匹配和組捕獲的正則表達式([AZ]{3}[0-9]{4}[AZ]{2}[0-9]),([AZ]{3}),([AZ]{3})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM