Найти - Пользователи
Полная версия: Регулярные выражения
Начало » Python для новичков » Регулярные выражения
1
ioprst
Привет. Подскажите как правильно написать регулярное выражение: нужно выбрать из текста (формулы) все “переменные” кроме 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().
py.user.next
Тут нужен лексический анализ. И регулярные выражения не выполнят его за тебя. Опиши задание чётче. Что и почему надо выбрать? Что и почему не нужно выбирать? Что на входе и что на выходе? Какие формулы поступают и какие результаты из них должны получаться?
ioprst
Символы в формуле могут принимать значения: пробелы + - * / ^(т.к. я делаю это для того, чтобы вставить результат в матлаб, то **->^), скобки, 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.”.
py.user.next
Лексический анализатор тут нужно строить. Регулярное выражение не поймёт, переменная это или не переменная. Для регулярного выражения это просто буквы и не более.
Вот пример лексического анализатора
python.org. tokenizer

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

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

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