Использование regex_replace для выражения в скобках - PullRequest
0 голосов
/ 02 мая 2018

Gal: небольшая программа на c ++ для преобразования вывода клена в допустимый ввод mathematica.

Проблема: выражения в скобках в следующем примере: грех (-1 / (- 1 + x) / x) должен стать грехом [-1 / (- 1 + x) / x]

Как видите, следует заменить только скобки для самой функции sin. Есть ли способ сделать это, не касаясь внутреннего содержимого скобок, используя regex_replace ()? Я не смог придумать это сам.

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

Заранее спасибо!

1 Ответ

0 голосов
/ 02 мая 2018

Если у вас есть выход Maple, потому что вы генерируете его в Maple, то, возможно, вы можете создать желаемый вывод одновременно.

Трудно сделать его более применимым к вашей более широкой цели только с одним кратким примером.

Использование одинарных кавычек и вызовов 1-уровня eval предотвращает нежелательную оценку (например, в противном случае Maple выдернет ведущий знак минус из вызова sin).

ee := 'sin'(-1/(-1+x)/x):

lprint( eval(ee,1) );    
  sin(-1/(-1+x)/x)

ff := subsindets(eval(ee,1),specfunc(sin),u->'Sin'[op(u)]):

lprint( eval(ff,1) );                                      
  Sin[-1/(-1+x)/x]

sprintf("%a", eval(ff,1) );

           "Sin[-1/(-1+x)/x]"

Или, если ваш оригинал является строкой, а не неоцененным вызовом функции,

restart;

s:="sin(-1/(-1+x)/x)";

        s := "sin(-1/(-1+x)/x)"

gg:=parse(s):

lprint( eval(gg,1) );
  sin(-1/(-1+x)/x)

ff := subsindets(eval(gg,1),specfunc(sin),u->'Sin'[op(u)]):

lprint( eval(ff,1) );
  Sin[-1/(-1+x)/x]

sprintf("%a", eval(ff,1) );

          "Sin[-1/(-1+x)/x]"
...