Уведомления

Группа в Telegram: @pythonsu

#1 Март 15, 2024 16:46:47

Arik
Зарегистрирован: 2024-03-15
Сообщения: 1
Репутация: +  0  -
Профиль   Отправить e-mail  

Разобрать мтроку

Привет всем.
При парсинге email с содержанием заказа, после очистки мусора, получаю строку типа: “Мешки для мусора Paclan ароматизированные с завязками 35 л 14 шт 2 шт 179,00 ₽ 358,00 ₽ 1 шт Собран”.

Строка содержит:
Название товара - “Мешки для мусора Paclan ароматизированные с завязками 35 л 14 шт”;
Кол-во в покупке - “2 шт”;
Стоимость за единицу - “179,00 ₽”;
Сумму - “358,00 ₽”;
Непонятное количество - “1 шт”;
Метку о статусе - “Собран”.

Помогите разобрать строку на части с целью помещения ее в таблицу.

Офлайн

#2 Март 15, 2024 19:38:50

xam1816
Зарегистрирован: 2020-05-11
Сообщения: 1350
Репутация: +  118  -
Профиль   Отправить e-mail  

Разобрать мтроку

покажите какой email приходит полностью

Отредактировано xam1816 (Март 15, 2024 22:31:56)

Офлайн

#3 Март 16, 2024 18:29:55

sa
Зарегистрирован: 2024-03-16
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Разобрать мтроку

начинать разбор строки слева, не очень надежно, судя по примеру строки.
Начни справа, статус он похоже фиксированные значения имеет, также единицы измерения и валюта Рубль
далее поиском по подстроке штуки, рубли разложи на пять частей
5. Кол-во в покупке - “2 шт”;
4. Стоимость за единицу - “179,00 ₽”;
3. Сумму - “358,00 ₽”;
2. Непонятное количество - “1 шт”;
1. Метку о статусе - “Собран”.

что осталось это название, шестая часть

статусы, единицы измерения сделай в список возможных значений и перебором проверяй в поиске по строке из письма

Офлайн

#4 Март 16, 2024 20:58:15

ZerG
Зарегистрирован: 2012-04-05
Сообщения: 2627
Репутация: +  61  -
Профиль   Отправить e-mail  

Разобрать мтроку

да проще уже сделать string.split()
ТО есть оно развернет список разделенных через пробел символов а дальше уже
0 - статус
1 и 2 - кол шт
и так далее
Но есть сомнение что там оно будет статично - иначе можно было бы присылать мыло сразу в JSON каком нить



Влодение рускай арфаграфией - это как владение кунг-фу: настаящие мастира не преминяют ево бес ниабхадимости

Офлайн

#5 Март 16, 2024 21:32:37

sa
Зарегистрирован: 2024-03-16
Сообщения: 9
Репутация: +  1  -
Профиль   Отправить e-mail  

Разобрать мтроку

ZerG
да проще уже сделать string.split()ТО есть оно развернет список разделенных через пробел символов а дальше уже 0 - статус1 и 2 - кол шти так далееНо есть сомнение что там оно будет статично - иначе можно было бы присылать мыло сразу в JSON каком нить

Да согласен сплитом 100% лучше, по списку анализировать. Статус конечно может быть одно или несколько слов, хотелось бы побольше примеров или знать какие статусы возможны
Можно взять за статичное поле рубли, быстрее всего торговля за рубли, ну или опять же список валют.
Также найти справа последнее поле рубли, это валюта суммы и от нее пойти влево до наименования что осталось, и вправо, два поля “Непонятное количество - “1 шт”;” и остаток на статус сколько слов осталось.

А какая программа генерит письма, может можно в JSON

Отредактировано sa (Март 16, 2024 21:33:16)

Офлайн

#6 Март 30, 2024 21:04:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9860
Репутация: +  853  -
Профиль   Отправить e-mail  

Разобрать мтроку

Arik
При парсинге email с содержанием заказа, после очистки мусора, получаю строку типа: “Мешки для мусора Paclan ароматизированные с завязками 35 л 14 шт 2 шт 179,00 ₽ 358,00 ₽ 1 шт Собран”.
Arik
Помогите разобрать строку на части с целью помещения ее в таблицу.
  
>>> import re
>>> 
>>> text = 'Мешки для мусора Paclan ароматизированные с завязками 35 л 14 шт 2 шт 179,00 ₽ 358,00 ₽ 1 шт Собран'
>>> 
>>> pat = r'^(.+) (\d+ шт) (\d+,\d+ ₽) (\d+,\d+ ₽) (\d+ шт) (.+)$'
>>> 
>>> lst = re.search(pat, text).groups()
>>> lst
('Мешки для мусора Paclan ароматизированные с завязками 35 л 14 шт', '2 шт', '179,00 ₽', '358,00 ₽', '1 шт', 'Собран')
>>>



Офлайн

#7 Март 30, 2024 22:19:46

py.user.next
От:
Зарегистрирован: 2010-04-29
Сообщения: 9860
Репутация: +  853  -
Профиль   Отправить e-mail  

Разобрать мтроку

sa
Можно взять за статичное поле рубли
Запиши структуру строки в виде формы Бэкуса-Наура
wiki. ru. БНФ
wiki. en. БНФ
wiki. ru. БНФ расширенная

Вот так оно смотрится:
<текст> ::= <название> <пробелы> <количество 1> <пробелы> <цена 1> <пробелы> <цена 2> <пробелы> <количество 2> <пробелы> <статус>
<название> ::= <любой символ> { <любой символ> }
<пробелы> ::= <пробел> { <пробел> }
<количество 1> ::= <целое число> <пробел> <штуки>
<цена 1> ::= <целое число> <точка числа> <целое число> <пробел> <рубль>
<цена 2> ::= <целое число> <точка числа> <целое число> <пробел> <рубль>
<количество 2> ::= <целое число> <пробел> <штуки>
<статус> ::= <любой символ> { <любой символ> }
<любой символ> ::= <буква> | <цифра> | <знак препинания> | <пробел>
<пробелы> ::= <пробел> { <пробел> }
<целое число> ::= <цифра не ноль> { <цифра> }
<штуки> ::= "шт"
<точка числа> ::= ","
<пробел> ::= " "
<рубль> ::= "₽"
<буква> ::= <большая буква русская> | <маленькая буква русская> | <большая буква английская> | <маленькая буква английская>
<большая буква русская> ::= "А" | "Б" | ... | "Я"
<маленькая буква русская> ::= "а" | "б" | ... | "я"
<большая буква английская> ::= "A" | "B" | ... | "Z"
<маленькая буква английская> ::= "a" | "b" | ... | "z"
<цифра не ноль> ::= "1" | ... | "9"
<цифра> ::= "0" | "1" | ... | "9"
<знак препинания> ::= "." | "," | ":" | ";" | "_"

Дальше ты можешь разбирать лексемы. Можно сразу объёмные лексемы разбирать, находящиеся наверху дерева вывода (которое строится по этой грамматике), а можно спускаться до более детальных лексем и разбирать их.

Можно использовать регулярные выражения, можно не использовать регулярные выражения. Чаще всего, конечно, в подобных задачах используются комбинированные способы. То есть ты не обязан использовать только регулярные выражения, если применяешь их для разбора какой-то части текста. Можно одну часть текста разобрать регулярным выражением, другую часть текста разобрать строковым методом, третью часть текста разобрать символьной операцией.


tags: bnf



Отредактировано py.user.next (Март 30, 2024 22:27:18)

Офлайн

Board footer

Модераторировать

Powered by DjangoBB

Lo-Fi Version