質問: sgn(A*sin(x1+b))+b*cos(max(x2,xt)+2*b) といった式の中から 変数:x1、x2 定数:A、、b、xt を取り出したいと考えています。 式を文字列として読み込んで、=、*、-、+、/,(、)等を区切り文字とし、関数名や数字を除けば良いかとも考えましたが、max関数やsin、cos、acos、cosh等、考えられる関数の数がかなり多く、ユーザーがどのような入力をするか分からないため、上記の方法では難しそうで、現在息詰まっております。(上式は一例で、実際にユーザーがどのような形で式を入力するかは様々なケースがあり得ます) もう少し考えてみますが、良い案をお持ちの方がいらっしゃいましたら、アイディアだけでも構いませんので、ご教授いただければ幸いです。 宜しくお願いいたします。
回答: 正規表現版。 ``` import re s = 'y = sgn(A*sin(x1+b))+b*cos(max(x2,xt)+2*b)' funcs = {'sgn', 'sin', 'cos', 'tan', 'max', 'min'} items = set(filter(None, re.split(r'\W', s))) ans = items - funcs print(ans) ``` 関数を列挙しない版。 ``` import re s = 'y = sgn(A*sin(x1+b))+b*cos(max(x2,xt)+2*b)' s = re.sub(r'[a-zA-Z]\w+\(', '(', s) items = set(filter(None, re.split(r'\W', s))) items = [v for v in items if not re.match(r'^[0-9]', v)] print(items) ```