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

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

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

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

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

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

А какая программа генерит письма, может можно в JSON
py.user.next
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 шт', 'Собран')
>>>
py.user.next
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
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB