У меня есть текстовая строка в более крупной строке, которая имеет следующий вид:
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'}