Форум программистов, компьютерный форум, киберфорум
Python для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/18: Рейтинг темы: голосов - 18, средняя оценка - 4.83
242 / 208 / 36
Регистрация: 19.02.2021
Сообщений: 1,431

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

28.06.2021, 13:31. Показов 3830. Ответов 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
7390 / 4817 / 1246
Регистрация: 30.03.2015
Сообщений: 13,664
Записей в блоге: 29
28.06.2021, 13:48
Constcat, да тут скорее всего именно регулярки подойдут, и это мракобесие в питоне работает быстрее многих других языков, в том числе компилируемых. Подробнее подсказать сможем если ты конкретный пример приведешь, а лучше 5-10. Можешь не с настоящими функциями, если они секретны. У нас тут есть сатанисты мастера регулярок, такого тебе накрутят, что и сам не поймешь как -но работает.
А если без регулярок можно то тоже подскажем, но надо увидеть что там.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 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
2695 / 1601 / 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
2695 / 1601 / 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
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru