242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431

Парсинг текста

28.06.2021, 13:31. Показов 3964. Ответов 22
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
По служебной необходимости столкнулся с ситуацией парсинга текста. С Python я знаком шапочно, к сожалению, поэтому прошу помощи.
Задача такая: на вход подается строка, где могут присутствовать (а могут и нет) некие, скажем так, "функции" имеющие примерно такой вид "Имя_Функции(Параметры)". Мне нужно "вычленить" из этой строки эти функции, затем их посчитать и вставить обратно уже результат. Есть список имен этих "функций".
Я могу сделать это "в лоб" примитивными программными средствами - найти первое совпадение с именем, сохранить позицию, затем посимвольно считать "параметры" от открывающей скобки и до закрывающей, сохранить длину всей функции, затем вставить результат, но мне бы хотелось использовать средства Python, т.к., он (насколько я знаю) как раз силен в подобных задачах.
Возможно, это нужно делать регулярными выражениями, но если выражение в скобках я еще смогу обернуть в регулярки, то учесть Имя функции я уже не знаю как.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.06.2021, 13:31
Ответы с готовыми решениями:

Парсинг текста с сайта
Добрый вечер! Питон знаю посредственно, как и HTML в принципе, но в голове закралась идея сделать бота в телеге, который будет брать...

Парсинг текста
Здравствуйте, надо зделать 2 функции в python. 1) Из большого текста вырезать кусок по параметрам слева и права Пример: cutOne('Lorem...

Парсинг и замена текста в html (python3)
Приветствую Друзья, если не затруднит, подскажите решение для python3. Есть некий html файл, вполне себе стандартный, в нем среди...

22
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7392 / 4819 / 1246
Регистрация: 30.03.2015
Сообщений: 13,695
Записей в блоге: 29
28.06.2021, 13:48
Constcat, да тут скорее всего именно регулярки подойдут, и это мракобесие в питоне работает быстрее многих других языков, в том числе компилируемых. Подробнее подсказать сможем если ты конкретный пример приведешь, а лучше 5-10. Можешь не с настоящими функциями, если они секретны. У нас тут есть сатанисты мастера регулярок, такого тебе накрутят, что и сам не поймешь как -но работает.
А если без регулярок можно то тоже подскажем, но надо увидеть что там.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
28.06.2021, 13:48
Constcat, стоит привести минимальный пример.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.06.2021, 14:01
Цитата Сообщение от Constcat Посмотреть сообщение
учесть Имя функции я уже не знаю как
Латиница, нижнее подчеркивание и цифры: \w

Отталкивайтесь от этого:
Python
1
2
3
4
>>> text = "func test(1,2,3)"
>>> re.findall(r"\w+?\(.*?\)", text)
['test(1,2,3)']
>>>
Для более точной:
Цитата Сообщение от Fudthhh Посмотреть сообщение
привести минимальный пример.
0
Костыли любой сложности
201 / 146 / 36
Регистрация: 27.10.2019
Сообщений: 843
28.06.2021, 14:03
Constcat, interact, code?
Цитата Сообщение от Constcat Посмотреть сообщение
закрывающей
игнорируя экранирование?
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
28.06.2021, 14:12
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
import re
 
EXAMPLE = """
Сегодня: DATE_TIME(28, 06, 2021)
Заработано: CALC_INCOME(10000.00)
"""
 
 
def DATE_TIME(day: str, month: str, year: str) -> str:
    return f"{day}/{month}/{year}"
 
 
def CALC_INCOME(total: str) -> str:
    return f"{float(total) * 0.82:.2f}"
 
 
for match in re.finditer(r"(\w+)\((.+)\)", EXAMPLE):
    function, args = match.groups()
    result = globals()[function](*re.split(r",\s*", args))
    EXAMPLE = EXAMPLE.replace(match.group(), result)
 
print(EXAMPLE)
# Сегодня: 28/06/2021
# Заработано: 8200.00
1
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
28.06.2021, 15:37  [ТС]
Цитата Сообщение от Fudthhh Посмотреть сообщение
Constcat, стоит привести минимальный пример.
Привожу:
Функции типа PROJECT_NAME(=,"Проект1") / PROJECT_START(>, "01.24.2021") / т.д. На самом деле, имена могут быть любыми, они в константном списке находятся типа
functionList = ["PROJECT_NAME", "PROJECT_START",...]
Функции изначально находятся в Экселевском листе, в обычных ячейках.
Мне нужно прочитать лист, пробежаться по всем ячейкам, и заменить все найденные "функции" их значениями, отфильтровав по условию в круглых скобках. Но эта задача другая, для начала мне нужно определиться с парсингом.
Это что-то типа конструктора отчетов.

Добавлено через 6 минут
Цитата Сообщение от user-ganz Посмотреть сообщение
игнорируя экранирование?
Я имел ввиду без регулярок вообще, в лоб. Т.е., найти очередное совпадение подстроки с каким-то элементом списка, затем посимвольно считать дальше от открывающей скобки до закрывающей.

Добавлено через 4 минуты
Цитата Сообщение от Fudthhh Посмотреть сообщение
print(EXAMPLE)
Это круто! Хорошо, что я сюда обратился. Получается, Python может преобразовать строковое имя функции в реальный вызов одноименной функции.
Спасибо!
0
Костыли любой сложности
201 / 146 / 36
Регистрация: 27.10.2019
Сообщений: 843
28.06.2021, 15:40
Constcat, наверное раз третий сегодня пишу "модуль inspect и code" там как бы есть доступ к названиям функций и строкам где они вызываются.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2696 / 1602 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
28.06.2021, 15:40
Constcat, это не большой пример, есть варианты реализации лучше и стабильнее.
Если ты работаешь с excel, для работы с данными особенно больших размеров, используй pandas.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
28.06.2021, 15:50  [ТС]
Цитата Сообщение от Fudthhh Посмотреть сообщение
Если ты работаешь с excel, для работы с данными особенно больших размеров, используй pandas.
У меня с pandas не срослось, к сожалению. Пока остановился на openpyxl.
Ситуация осложняется тем, что основной софт - кроссплатформенный, написан на C++. Python обслуживает различного рода отчеты, он "прилинковывается" к основному софту в виде .DLL + минимальный набор его модулей в виде .zip файла. Причем некоторые его настройки, типа системных путей и подключение некоторых модулей (типа StringIO) настраиваются прямо из софта.
Другими словами, минимально-необходимый набор библиотек и модулей Python интегрирован прямо в софт. В этой каше мне не удалось даже tkinter подключить для вывода хотя бы хоть какой-то отладочной информации. Отладка в этой ситуации - это отдельная задача...
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.06.2021, 16:32
Цитата Сообщение от user-ganz Посмотреть сообщение
наверное раз третий сегодня пишу "модуль inspect и code" там как бы есть доступ к названиям функций и строкам где они вызываются.
Скажи, какое отношение это имеет excel функциям? Правильно - н-и-к-а-к-о-г-о.

Добавлено через 1 минуту
Цитата Сообщение от Constcat Посмотреть сообщение
Python может преобразовать строковое имя функции в реальный вызов одноименной функции.
Если это своя родная функция. Excel - это совершенно сторонний объект.

Добавлено через 2 минуты
Чтобы иметь возможность вызывать Excel функцию или макрос нужно работать с COM объектом Excel.Application.
0
Костыли любой сложности
201 / 146 / 36
Регистрация: 27.10.2019
Сообщений: 843
28.06.2021, 16:44
Цитата Сообщение от Constcat Посмотреть сообщение
парсинга текста
Цитата Сообщение от Constcat Посмотреть сообщение
Задача такая: на вход подается строка,
Цитата Сообщение от Constcat Посмотреть сообщение
"Имя_Функции(Параметры)"
Цитата Сообщение от Constcat Посмотреть сообщение
Есть список имен этих "функций".
тебе уазать на прямую что именно из документации ты процитировал?
Цитата Сообщение от Garry Galler Посмотреть сообщение
имеет excel функциям?
намекни мне косвенно когда ты упомянул о поверпоинт?
(в курсе что ppt не xls) но ты умеешь грамотно формулировать вопрос?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
28.06.2021, 16:56  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Если это своя родная функция. Excel - это совершенно сторонний объект.
Да, это моя родная функция. В экселевском листе пользователь размещает "функции-заглушки" из списка допустимых. С точки зрения Экселя, эти функции всего лишь возвращают свое собственное имя.
Если интересно, это выглядит примерно так:
PureBasic
1
2
3
4
5
6
7
8
9
10
Private Function FullFunctionName(FunctionName As String, Condition As String, Argument As String)
    Parameter = "("
    If Condition = "" Then Condition = "="
    If Argument <> "" Then Parameter = Parameter + Condition + "," + Argument
    Parameter = Parameter + ")"
    FullFunctionName = FunctionName + Parameter
End Function
Public Function PROJECT_NAME(Optional Condition As String, Optional Argument As String)
    PROJECT_NAME = FullFunctionName("PROJECT_NAME", Condition, Argument)
End Function
Затем я в Python должен прочитать этот лист, "вычленить" эти функции и заменить их реальными значениями, которые поставляет основной софт, затем сохранить в другой Excel-файл.

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

Добавлено через 1 минуту
Цитата Сообщение от user-ganz Посмотреть сообщение
тебе уазать на прямую что именно из документации ты процитировал?
Я, вроде, ничего не цитировал. Кратко описал постановку задачи.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.06.2021, 17:06
Цитата Сообщение от Constcat Посмотреть сообщение
Меня очень заинтересовала возможность Python вызывать функции по имени, хранящемся в строковой переменной.
Повторю: если это Python функция.
Каким образом Python может выполнить VBA функцию (без COM объекта Excel.Application)?
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
28.06.2021, 17:13  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Повторю: если это Python функция.
Каким образом Python может выполнить VBA функцию?
Ну, я еще раз повторю.
Функция - моя. Не Экселевская. В Экселе они выглядят, как "функции-заглушки", возвращающие собственное имя (для удобства пользователя.
И до посещения этого форума, это вообще были не функции, а спец. слова, изображающие функции.
Я их распознавал простыми примитивными программными способами и таким же образом (через if - elif - elif...) заменял на реальные значения.
В этой ветке я узнал, что Python может вызвать реальную функцию по ее имени, хранящейся в строковой переменной.
В связи с этим (и с тем, что мне дополнительно нужно обрабатывать параметры в скобках (их раньше не было, это дополнение к постановке задачи)), я хочу из этих спец. символов сделать реальные функции Python и вызывать их вышеуказанным методом.

Повторю идею - в Экселе в ячейках расположены некие спец. символы. При помощи Python, я читаю лист, собираю эти спец.символы, заменяю их реальными значениям, вставляю их в те же места, откуда брал и сохраняю в другом листе.
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.06.2021, 17:24
Ничего не понял. Слишком хитромудро и непонятно зачем.
Вот эти имена PROJECT_NAME(=,"Проект1") / PROJECT_START(>, "01.24.2021")
на Python функции никак не похожи и вызывать ты их никак не сможешь даже после парсинга имен.
Впрочем, варианты регулярок здесь уже были предложены. Дерзай.

Python
1
2
3
4
5
>>> text = """PROJECT_NAME(=,"Проект1") / PROJECT_START(>, "01.24.2021")"""
>> re.findall(r"(?i)(\w+?)\((.*?)\)", text)
[('PROJECT_NAME', '=,"Проект1"'), ('PROJECT_START', '>, "01.24.2021"')]
>>> 
>>>
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
28.06.2021, 17:34  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Ничего не понял. Слишком хитромудро и непонятно зачем.
1. Основной софт продуцирует данные.
2. Есть пользователи, которые хотят видеть эти данные в красивом формате Экселя.
3. Специально для этих пользователей мы придумали спец. слова, соответствующие этим данным, которые можно расставить в нужных местах Экселевского листа, который будет являться что-то типа шаблона-заготовки будущего отчета.
4. Потом наш софт при помощи интегрированного Python читает этот лист, заменяет эти спец. слова актуальными данными, вставляет в те же места, заменяя спец. слова и сохраняет в другой лист. Таким образом появляется отчет с реальными данными.
Выглядит это примерно так:
Миниатюры
Парсинг текста   Парсинг текста  
0
Эксперт Python
5438 / 3859 / 1215
Регистрация: 28.10.2013
Сообщений: 9,552
Записей в блоге: 1
28.06.2021, 17:35
Если нужно сразу разбить параметры на список, то можно все в словарь замапить:
Python
1
2
3
>>> {f[0]: list(map(str.strip,f[1].split(","))) for f in re.findall(r"(?i)(\w+?)\((.*?)\)", text)}
{'PROJECT_NAME': ['=', '"Проект1"'], 'PROJECT_START': ['>', '"01.24.2021"']}
>>>
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
28.06.2021, 17:41  [ТС]
Цитата Сообщение от Garry Galler Посмотреть сообщение
Вот эти имена PROJECT_NAME(=,"Проект1") / PROJECT_START(>, "01.24.2021")
Так я их и хочу оформить в виде функций Python, примерно так:
Python
1
def PROJECT_NAME(Object, Arguments)
где Object - это объект, из которого я буду брать данные, а Arguments - это "=,Проект1", который мне придется еще проанализировать, чтобы дополнительно отфильтровать имеющиеся данные.
Судя по приведенному примеру, я могу получить имя функции, а параметры передать уже те, которые нужны.

Добавлено через 3 минуты
Цитата Сообщение от Garry Galler Посмотреть сообщение
Если нужно сразу разбить параметры на список, то можно все в словарь замапить:
Там сложнее. Для, например, строковых значений (типа NAME), предусмотрены условия =, <>, in. Т.е., может быть и PROJECT_NAME(<>,"Проект1"), и PROJECT_NAME(in,"Проект1") (in - include)
Для числовых, соответственно, =, <>, >, <, >=, <=
Ну, и для даты такие же, как и для чисел.
0
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431
29.06.2021, 14:29  [ТС]
Цитата Сообщение от Fudthhh Посмотреть сообщение
стоит привести минимальный пример.
Снова я к вам.
Вот, не получается разобрать подобные строки. Слаб в регулярках, к сожалению...
PROJECT_DURATION(>,50) - TASK_DURATION(=,70)
- на выходе должны получится имена двух функций PROJECT_DURATION с параметром "<,50" и TASK_DURATION с параметром "=,70".

PROJECT_COST(<,1000) * 365
- аналогично. Нужно получить PROJECT_COST с параметром "<,1000"


"Manager " + PRROJECT_NAME(=,Иванов)
- PRROJECT_NAME, параметр "=,Иванов"

И еще. К сожалению, мы вынуждены использовать Python 2.7. Стоит вопрос о переходе на следующую версию, но это будет позже.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.06.2021, 14:29
Помогаю со студенческими работами здесь

Парсинг текста на сайте с защитой от копирования
Уважаемые форумчане, прошу помощи: есть сайт с текстом книги, но он защищен от копирования. Помогите спарсить весь текст книги в файлик. ...

Парсинг по порядку или парсинг до определенного тега
Доброго времени друзья! Подскажите пожалуйста, к примеру есть вот такой html код: &lt;div class=&quot;container mt-3&quot;&gt; ...

Парсинг текста
Здравствуйте, у меня есть строка char* с огромным количеством текста(в мб) как ее можно про парсить? Можно пример, с любым много строчным...

парсинг текста
Ну в общем,хочу спарсить с сайта текста находящийся между тегами,но компилятор ругается. a=(List-&gt;Text.Pos(&quot;&lt;a...

Парсинг текста
Парсит один раз, хотя значений как минимум 15. Как правильно сделать цикл? Помогите пожалуйста. var parser, log:string; begin ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru