python — C ++: извлечение символов / переменных из аналитического математического выражения

У меня есть выражения, которые могут быть предоставлены пользователем, такие как:

 a*sin(w*t)
a+b/c
x^2+y^2/2

И я бы хотел просто получить список переменных там. Мне не нужно делать никаких замен. Итак, для первой формулы это будет {a,w,t}, Для второго {a,b,c}и для последнего {x,y},

Выражение в первую очередь написано для анализа с помощью Sympy, но мне нужно иметь возможность получить список переменных в C ++ для некоторых проверок. Я бы хотел:

  • Избегайте привязки всего интерпретатора Python к моей программе
  • Избегайте изобретать колесо, как я видел, есть много доступных библиотек разбора, таких как muparser, но я не знаю, предоставляют ли какие-либо из них такую ​​функциональность

Какой самый простой способ сделать это? Как бы вы решили эту проблему?

3

Решение

Учитывая вход: const string input мы можем собрать или переменные в set<string> с регулярное выражение:

\b([a-zA-Z]\w*)(?:[^(a-zA-Z0-9_]|$)

Вы можете использовать это в C ++ следующим образом:

const regex re{ "\\b([a-zA-Z]\\w*)(?:[^(a-zA-Z0-9_]|$)" };
const set<string> output{ sregex_token_iterator(cbegin(input), cend(input), re, 1), sregex_token_iterator() };

Живой пример

РЕДАКТИРОВАТЬ:

regex объяснение:

  • \b утверждает \W символ или начало или конец строки
  • ([a-zA-Z] захватывает все, что начинается с буквенного символа
  • \w*) с последующим любым количеством символов «слово»
  • (?: указывает начало моего необязательного совпадения
  • [[^(a-zA-Z0-9_] 1улица опция не является открывающей скобкой \W персонаж
  • |$) другой вариант заключается в том, что был достигнут конец ввода
2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]