Уведомления

Группа в Telegram: @pythonsu

#1 Март 25, 2018 12:47:47

ioprst
Зарегистрирован: 2018-03-25
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Привет. Подскажите как правильно написать регулярное выражение: нужно выбрать из текста (формулы) все “переменные” кроме VT, VBE, VBC, т.е., например, для C2**IS*exp(VBE/(NEL*VT))/(NEL*VT) + IS*exp(VBE/VT)/(BF*VT) это будут С2, IS, NEL, BF.
Для начала написал следующее:

 re_obj = re.compile(r'([^\s*+\-*/()exp=][A-Za-z0-9]*)')
Выбирает все переменные, а вот убрать VT, VBE, VBC никак не получается.
Вариант выбрать все, а потом по списку пройти не подходит, т.к. регулярка нужна для функции sub().

Отредактировано ioprst (Март 25, 2018 12:53:40)

Офлайн

#2 Март 25, 2018 15:09:37

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

Регулярные выражения

Тут нужен лексический анализ. И регулярные выражения не выполнят его за тебя. Опиши задание чётче. Что и почему надо выбрать? Что и почему не нужно выбирать? Что на входе и что на выходе? Какие формулы поступают и какие результаты из них должны получаться?



Офлайн

#3 Март 25, 2018 17:20:15

ioprst
Зарегистрирован: 2018-03-25
Сообщения: 20
Репутация: +  0  -
Профиль   Отправить e-mail  

Регулярные выражения

Символы в формуле могут принимать значения: пробелы + - * / ^(т.к. я делаю это для того, чтобы вставить результат в матлаб, то **->^), скобки, exp ну и переменные:

 VBC = Symbol('VBC')
VBE = Symbol('VBE')
VA = Symbol('VA')
VB = Symbol('VB')
IS = Symbol('IS')
IK = Symbol('IK')
IKR = Symbol('IKR')
VT = Symbol('VT')
BR = Symbol('BR')
C4 = Symbol('C4')
NCL = Symbol('NCL')
BF = Symbol('BF')
C2 = Symbol('C2')
NEL = Symbol('NEL')
После нескольких выражений я получаю формулу. В этой формуле мне нужно ко всем именам переменных (кроме VT, VBE, VBC) добавить префикс “obj.”.

Офлайн

#4 Март 26, 2018 03:25:16

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

Регулярные выражения

Лексический анализатор тут нужно строить. Регулярное выражение не поймёт, переменная это или не переменная. Для регулярного выражения это просто буквы и не более.
Вот пример лексического анализатора
python.org. tokenizer

ioprst
В этой формуле мне нужно ко всем именам переменных (кроме VT, VBE, VBC) добавить префикс “obj.”.
Ну ты можешь для всех групп букв проставить префиксы, а потом удалить префиксы, которые неправильно проставились (у функций и у заданных имён). Но это всё сломается на какой-нибудь другой формуле. Ну это чисто такое тупое решение, которое долго не проживёт.

А при лексическом анализе ты можешь превратить формулу в поток лексем, где каждая лексема имеет тип и значение. Тип, допустим, - это <имя функции>, а значение - <exp>. То есть ты уже по типу можешь понять, что перед exp ничего ставить не надо. А если ты получил лексему (<имя переменной>, <VT>), то ты просто берёшь значение лексемы и по списку проверяешь, нет ли его в списке значений, запрещённых для добавления префикса.

Не думаю, что ты с этим справишься, потому что это всё уже нужно уметь делать (строить лексические анализаторы через конечные автоматы), но на будущее тебе вот такая информация. Одного желания тут недостаточно, это нужно учиться делать, выполнять задачки на построение, пока не получишь достаточно опыта. Я просто представляю эту программу уже в готовом виде (которая делает именно то, что тебе нужно) и понимаю, что ты её не напишешь.



Отредактировано py.user.next (Март 26, 2018 03:37:21)

Офлайн

Board footer

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

Powered by DjangoBB

Lo-Fi Version