如何用正则表达式实现数学方程分词?现有方案存在三类问题
数学方程正则分词优化方案
需求说明
输入示例:
-cos(x)+4ln(x^2.2)^4=-2(pi+x)
期望输出:
-cos ( x ) + 4 * ln ( x ^ 2.2 ) ^ 4 = -2 ( pi + x )
现有正则问题
你当前使用的正则:
\s*(?:([()^+*\/-])|([a-z]+)|((?:\.[0-9]+|[0-9]+(?:\.[0-9]*)?)(?:e[+-]?[0-9]+)?)|(\S))
存在以下问题:
- 数字与函数/变量之间缺失乘号(*)
- 数字/变量与左括号之间缺失乘号(*)
- 数字/变量/函数与负号(-)未合并为同一分词单元
优化后的正则方案
针对上述问题,调整正则逻辑如下:
(?<![\d\w)])-([a-z]+|\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?|(\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?(?=[a-z(])|([()^+*/=])|([a-z]+)|(\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?
正则逻辑拆解
- 带负号的单元:匹配开头或非数字/字母/右括号后的负号,将负号与后续的函数名、数字(含小数、科学计数法)合并为一个单元,比如
-cos、-2。 - 乘号插入场景:匹配数字后紧跟函数名或左括号的情况,后续处理时在数字后追加
*。 - 独立运算符:单独拆分括号、幂、加减乘除、等号这些符号,每个符号单独成词。
- 函数/变量:匹配单独的函数名或变量,比如
ln、x、pi。 - 独立数字:匹配不跟函数或左括号的数字。
分词处理逻辑
拿到正则匹配结果后按以下规则输出:
- 若匹配到“数字后跟函数/左括号”的组,先输出数字,再单独输出
*。 - 其他匹配结果直接输出,每个结果占一行。
按此处理输入示例,即可得到你期望的分词效果。
内容的提问来源于stack exchange,提问作者palloc
相关产品推荐
相关产品推荐

