2016-11-17 2 views
0

Для написания калькулятора, такого как интерпретатор python, я хочу проверить правильность моих выражений.Python Поиск повторяющихся операторов в строке

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

4 ++ - + 4 действует.

4 * -8 недействителен

4-/7 недействителен

4/-4 действительно, мое, вероятно, не может здесь.

minut и plus могут повторять сами, но - *, например, недействительны. Очень похоже на то, как работает интерпретатор python. Это то, что у меня есть, как Regex, но любое более простое решение приветствуется, даже не регулярное выражение.

[*/^%\-+][*/^%] | [\-+*/^%][*/^%] 

Link

Basicially, проверьте операторы */^% - + либо предшествуют или следуют */^% (без минуса и плюса)

+0

Что делать, если операторы разделены пробелами? –

+0

Операторы не разделены пробелами, а пробелы не существуют в моем тексте. (Должен ли я упомянуть об этом?) – Lumon

+0

Что именно должно «^^' уронить? Кошка? Возможно, вы захотите переопределить свою проблему :) – Jan

ответ

1

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

построить произведение всех операторов, как так:

from itertools import product as p 
all=list(p('*/^%-+',repeat=2)) 
all=map(lambda x:''.join(x),all) 

invalids=[..write them by hand in here(hacky part)] 
valids=filter(lambda x:x not in invalids,all) 

И теперь вы остались со всеми действительными операциями длины 2. Вы можете сканировать строку с окном 2, и когда вы найти пара операторов, не принадлежащих к валидам, вы можете объявить выражение недействительным и двигаться дальше.

Другой способ, которым вы могли бы пойти, это основанный на правилах. Постройте словарь с операторами как ключи, а для каждого оператора это будет список, содержащий все операторы, которые могут следовать за ним.

Тогда ваша проблема становится одной из проверки вашей строки на символе I с условием действий будучи

string[i+1] in dictionary[string[i]]

Если вы нашли решение CFG и его красивое, дайте мне знать,

Смежные вопросы