Форум программистов, компьютерный форум, киберфорум
Python: Научные вычисления
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.94/18: Рейтинг темы: голосов - 18, средняя оценка - 4.94
2 / 2 / 0
Регистрация: 10.11.2016
Сообщений: 13

Распарсить уравнение из файла (строки), для дальнейшей работы с ним

04.09.2019, 20:21. Показов 4010. Ответов 6

Студворк — интернет-сервис помощи студентам
Доброго времени суток, уже битый час пытаюсь найти готовый или реализовать свой метод позволяющий из файла достать формулу, для дальнейшей работой с нет, но ничего не выходит.(

Задача следующая: есть файл в котором лежит уравнение с одной переменной, промежуток (a, b) и погрешность. Нужно найти корень уравнения на промежутке (по условию на промежутке только один корень) с заданной погрешностью несколькими методами.

Как реализовать сами методы я знаю, и основной проблемой стала работа с формулой, записанной в строке.
У преподавателя есть написанная им либо на Си, исходники которой он показывать не хочет, а уж больно хочется реализовать эту задачу на Python.
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
04.09.2019, 20:21
Ответы с готовыми решениями:

Как вернуть массив обьектов для дальнейшей работы с ним?
#include <iostream> class Ex { public: Ex(char *);//конструктор ~Ex();//деструктор (пока не используется) Ex...

Отчистить битмап от существующей графики с возможностью дальнейшей с ним работы
Доброго времени суток, товарищи программисты. :drink: Предо мной встала задачка следующего рода: мне нужно отчистить битмап от...

Считать числа из файла в массив для дальнейшей работы с ними
дан файл, в котором записаны данные: X 1 2 35 41 5 63 7 80 нужно считать ЧИСЛА из файла в массив для работы с ними. Никак не...

6
Автоматизируй это!
Эксперт Python
 Аватар для Welemir1
7391 / 4818 / 1246
Регистрация: 30.03.2015
Сообщений: 13,687
Записей в блоге: 29
04.09.2019, 20:30
KrimsN, предлагаешь нам самим придумать формулу и записать ее в файл, а потом распарсить?
0
2 / 2 / 0
Регистрация: 10.11.2016
Сообщений: 13
05.09.2019, 09:46  [ТС]
Формула может быть любая, вида x^2+20x-100 или sin(x) или всё вместе

Функции, заданные в аналитическом виде, представляют собой текстовые строки, содержащие:
• математические операции (сложение, вычитание, умножение, деление, возведение в степень);
• функции (sin, cos, tg, ctg, exp, ln, lg);
• константы (числовые, pi, e);
• унарный плюс и минус;
• неизвестные переменные (x – если переменная является скаляром и x1, x2, …, xn – если вектором длиной n);
• круглые скобки.

Я лишь спрашиваю, есть ли что-то готовое, или какие есть идеи по решению этой проблемы
0
Эксперт Python
 Аватар для dondublon
4652 / 2072 / 366
Регистрация: 17.03.2012
Сообщений: 10,182
Записей в блоге: 6
05.09.2019, 09:53
KrimsN, ну, совсем любая формула быть не может, надо всё-таки ограничить, чтобы реализовать.
Пока я вижу, что можно подогнать строку, чтобы выполнить с помощью ast.literal_eval. Для этого:
1. заменить "^" на "**",
2. Строки, которые .endswith('x') заменить на "...*x".

Есть и готовый модуль-парсер, я на pypi видел.
0
Модератор
Эксперт Python
 Аватар для Fudthhh
2695 / 1601 / 513
Регистрация: 21.02.2017
Сообщений: 4,210
Записей в блоге: 1
05.09.2019, 16:58
Все таки нашел, может натолкнет на мысли:

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
25
26
27
28
29
30
31
32
33
# -*- coding: utf-8 -*-
import re
 
operation = {
    "*": lambda x, y: str(float(x) * float(y)),
    "/": lambda x, y: str(float(x) / float(y)),
    "+": lambda x, y: str(float(x) + float(y)),
    "-": lambda x, y: str(float(x) - float(y))
}
 
def parse(example:str)->str:
    #Умножение и деление
    while True:
        match = re.search(r"(\d+\.?\d*)\s([\*\/])\s(\d+\.?\d*)", example)
        if not match:
            break
        exx = match.group(0)
        arg1, arg2 = match.group(1), match.group(3)
        oper = operation[match.group(2)]
        example = example.replace(exx, oper(arg1, arg2))
    #Сложение и вычетание
    while True:
        match = re.search(r"(\d+\.?\d*)\s([\+\-])\s(\d+\.?\d*)", example)
        if not match:
            break
        exx = match.group(0)
        arg1, arg2 = match.group(1), match.group(3)
        oper = operation[match.group(2)]
        example = example.replace(exx, oper(arg1, arg2))
    return example
 
if __name__ == '__main__':
    print(parse("10 / 100 * 10 + 1 * 5 + 2 * 5"))
Добавлено через 11 минут
UPD: Забыл про знаки, добавил степень, корень.

Кликните здесь для просмотра всего текста

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
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# -*- coding: utf-8 -*-
import re
 
operation = {
    "^": lambda x, y: str(float(x)**float(y)),
    "√": lambda x, y: str(float(y)**(1 / float(x))),
    "*": lambda x, y: str(float(x) * float(y)),
    "/": lambda x, y: str(float(x) / float(y)),
    "+": lambda x, y: str(float(x) + float(y)),
    "-": lambda x, y: str(float(x) - float(y))
}
 
def parse(example:str)->str:
    # Степень
    while True:
        match = re.search(r"([-+]?\d+\.?\d*)(\^)([-+]?\d+\.?\d*)", example)
        if not match:
            break
        exx = match.group(0)
        arg1, arg2 = match.group(1), match.group(3)
        oper = operation[match.group(2)]
        example = example.replace(exx, oper(arg1, arg2))
    # Корень
    while True:
        match = re.search(r"([-+]?\d+\.?\d*)?(√)([-+]?\d+\.?\d*)", example)
        if not match:
            break
        exx = match.group(0)
        arg1 = match.group(1) if match.group(1) else 2
        arg2 = match.group(3)
        oper = operation[match.group(2)]
        example = example.replace(exx, oper(arg1, arg2))
    #Умножение деление
    while True:
        match = re.search(r"([-+]?\d+\.?\d*)\s([\*\/])\s([-+]?\d+\.?\d*)", example)
        if not match:
            break
        exx = match.group(0)
        arg1, arg2 = match.group(1), match.group(3)
        oper = operation[match.group(2)]
        example = example.replace(exx, oper(arg1, arg2))
    #Сложение вычетание
    while True:
        match = re.search(r"([-+]?\d+\.?\d*)\s([\+\-])\s([-+]?\d+\.?\d*)", example)
        if not match:
            break
        exx = match.group(0)
        arg1, arg2 = match.group(1), match.group(3)
        oper = operation[match.group(2)]
        example = example.replace(exx, oper(arg1, arg2))
    return example
 
if __name__ == '__main__':
    print(parse("10 / 100 * 10 + 1 * 5 + 2 * 5 - 5^2 + √16"))
0
05.09.2019, 17:05

Не по теме:

DmFat, каждый настоящий программист должен написать в своей жизни парсер математических выражений.

0
06.09.2019, 07:59

Не по теме:

dondublon, это одна из двух тем из за которой я начал изучать регулярки, вторая это парсер документов.

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
06.09.2019, 07:59
Помогаю со студенческими работами здесь

Как можно получить данные из файла .dot для дальнейшей работы
Здравствуйте, уважаемые! Помогите пожалуйста! Как можно выцепить данные из файла .dot для дальнейшей работы с ними в программе? Те данные,...

Проблема со считыванием данных с файла excel и преобразованием для дальнейшей работы
Доброго времени суток ,НАЧАЛ ИЗУЧАТЬ ПРОГРАММИРОВАНИЕ(НОВИЧОК).Попробую объяснить в чем я не могу разобраться. Создано окно входа в...

Как получить имя файла для дальнейшей работы с этим файлом?
Есть программа в которой используются функции GetOpenFile() и GetSaveFile() для открытия и сохранения файлов. Нужно получить из этих...

Нормальная ли практика создавать копию строки (массива char) передаваемую в функцию для дальнейшей работы
Уважаемые, скажите, нормальная ли практика создавать копию строки(массива char) передаваемую в функцию для дальнейшей работы. Меняя...

Вытащить из файла массив для работы с ним
Здравствуйте. Есть задача - имеется текстовый файл, в котором находится массив. Его размер мы заранее не знаем. Нужно вытащить из файла...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru