регулярное выражение python (re.search) не может обнаружить ошибки - PullRequest
0 голосов
/ 14 мая 2019

Я пытаюсь обнаружить ошибки в данных в CSV-файле, используя re.search, в котором неверные данные (не соответствующие заданному шаблону) будут отправлены в один список (ошибка), а правильные данные (которые соответствуютшаблон) будет отправлен в другой список (чистый)

Вот так выглядят данные в файле 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']

До сих пор я не могу найти ошибку или найти какое-либо альтернативное решение.Спасибо за вашу помощь, я ценю это.

1 Ответ

1 голос
/ 14 мая 2019

Проблема в том, что регулярное выражение запускается при первом совпадении, которое оно находит всегда. Поскольку программа чтения 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})

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...