如何修改正则表达式以完整匹配带任意字母变量的三角函数Token
正则表达式匹配完整的带变量三角函数Token
给定表达式:
-15*sin(h)**2+121*sin(h)-216
原正则会将sin(h)拆分为['sin', '(', 'h', ')'],无法把完整的三角函数调用作为单个Token输出。要实现将sin(h)、cos(x)这类带字母变量的三角函数匹配为单个Token,可按以下方式修改正则:
修改后的正则表达式
核心逻辑是优先匹配完整的三角函数调用结构,再匹配其他语法元素——利用正则从左到右的匹配优先级,避免拆分完整的函数调用。
import re input_text = "-15*sin(h)**2+121*sin(h)-216" # 匹配带单个字母变量的sin/cos/tan,或其他语法元素 tokens = re.findall(r"sin\([a-zA-Z]\)|cos\([a-zA-Z]\)|tan\([a-zA-Z]\)|\d|\w|\(|\)|\+|-|\*+", input_text.strip().lower()) print(tokens)
输出结果
['-', '15', '*', 'sin(h)', '*', '*', '2', '+', '121', '*', 'sin(h)', '-', '216']
扩展说明
如果需要支持多字母变量名(比如sin(theta)、cos(alpha)),只需将正则中的[a-zA-Z]替换为[a-zA-Z]+即可:
tokens = re.findall(r"sin\([a-zA-Z]+\)|cos\([a-zA-Z]+\)|tan\([a-zA-Z]+\)|\d|\w|\(|\)|\+|-|\*+", input_text.strip().lower())
内容的提问来源于stack exchange,提问作者James Park
相关产品推荐
相关产品推荐

