Извлечение определенных c столбцов из строки строк - PullRequest
0 голосов
/ 05 мая 2020

У меня есть текстовая строка в более крупной строке, которая имеет следующий вид:

FLIGHT / DATE             MAWB                   HAWB 
SQ8345                        84937590            SMIS20935
GOODS COLLECTED FROM 

Итак, в основном 3 строки выше, первые 2 строки имеют по 3 записи каждая, а последняя строка - это просто ТОВАРЫ, СОБИРАЕМЫЕ ИЗ строки

В некоторых случаях то же самое, что и выше, может иметь следующее:

ROAD REFERENCE           MASTER BILL                  HOUSE BILL 
SQ8345                        84937590            SMIS20935
GOODS COLLECTED FROM 

То же самое, только заголовок ПОЛЕТ / ДАТА иногда заменяется ДОРОЖНОЙ ССЫЛКОЙ, как и два других заголовка вначале. линия.

Мне нужен результат, как показано ниже. Это означает, что даже если MAWB называется MASTER BILL, а HAWB присутствует как HOUSE BILL, окончательный вывод может переименовать их как предыдущую версию (так как это наиболее часто встречающееся имя)

{"MAWB" : 84937590, 
  "HAWB" :  SMIS20935
} 

Моя идея состоит в том, чтобы извлечь целых 3 строки от «ПОЛЕТ / ДАТА» или «ДОРОЖНАЯ ИНФОРМАЦИЯ» до строки «ТОВАР, ПОЛУЧЕННЫЙ ОТ».

Затем используйте линии разделения на этой извлеченной строке и разделите ее как список списка. Наконец, используйте zip () и найдите вторые списки, чтобы сформировать приведенный выше dict.

Сначала я сделал это:

 re.search(
    r'(?s)(MAWB\s*HAWB.+?GOODS COLLECTED FROM)', output).group()

и получил это в виде строки

'MAWB              HAWB\n      
/ SQ8345 /             84937590       SMIS20935\n    
 GOODS COLLECTED FROM'

Итак, это извлекает все три как строку строк, которая полезна как затем мы можем использовать полоски поверх этого и извлечь как список списков.

Однако первый заголовок столбца отсутствует, поэтому так и было:

re.search(
    r'(?s)(FLIGHT.*DATE|ROAD REFERENCE\s*HAWB|MASTER BILL\s*.+?GOODS COLLECTED FROM)', output).group()

Но я получаю только

FLIGHT / DATE. 

В идеале я хотел, чтобы приведенное выше давало:

FLIGHT / DATE             MAWB                   HAWB 
SQ8345                        84937590            SMIS20935
GOODS COLLECTED FROM 

на трех разных строках. И затем я могу использовать

s = [
    re.split(r'\s{2,}', line.strip()) for line in s.splitlines() if line !=''
]

, чтобы получить приведенные выше строки в виде списка списков длиной 3.

Что мне не хватает в приведенном выше регулярном выражении, которое не извлекает целую строку, пока ТОВАРЫ не СОБРАНЫ ОТ и получает только первую часть (ПОЛЕТ / ДАТА)

ОБНОВЛЕНИЕ:

Я пробовал это: Кажется, я дал правильный ответ. Просто хотел проверить, может ли это вызвать какие-либо проблемы

mawb=  re.search(
    r'(?s)((FLIGHT|ROAD REFERENCE).*(MAWB|MASTER BILL)\s*.+?GOODS COLLECTED FROM)', output).group()

mawb= [
    re.split(r'\s{2,}', line.strip()) for line in (mawb.splitlines()) if line !=''
]

{pair[0]: pair[1] for i, pair in enumerate(zip(*mawb[:-1])) if i!=0}


{'MAWB': '84937590', 'HAWB': 'SMIS20935'}

1 Ответ

1 голос
/ 05 мая 2020
^(?:[\w/]+(?:[ ][\w/]+)*)[ ]{2,}([\w/]+(?:[ ][\w/]+)*)[ ]{2,}([\w/]+(?:[ ][\w/]+)*)[ ]*$\r?\n^(?:[\w/]+(?:[ ][\w/]+)*)[ ]{2,}([\w/]+(?:[ ][\w/]+)*)[ ]{2,}([\w/]+(?:[ ][\w/]+)*)[ ]*$\r?\nGOODS[ ]+COLLECTED[ ]+FROM[ ]*$   

демо

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