Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 解析一组数学表达式并分离术语_Python_Regex_Parsing - Fatal编程技术网

Python 解析一组数学表达式并分离术语

Python 解析一组数学表达式并分离术语,python,regex,parsing,Python,Regex,Parsing,在一个文本文件中,我在两个关键字之间有一个文本块,我们称它们为关键字1和关键字2,它包含在一个大的数学表达式中,这个表达式是一个较小表达式的总和,可能或多或少复杂。随机数是指一些已编号的变量。 例如,这可能是这样的: keyword1 x47*ln(x46+2*x38) + (x35*x24 + exp(x87 + x56))^2 - x34 + ... + ..... + ..... keyword2 我想做的就是把这个大的数学表达式和它的组合项分开,然后把这些原子项存储在一个列表中,例如

在一个文本文件中,我在两个关键字之间有一个文本块,我们称它们为关键字1和关键字2,它包含在一个大的数学表达式中,这个表达式是一个较小表达式的总和,可能或多或少复杂。随机数是指一些已编号的变量。 例如,这可能是这样的:

keyword1 x47*ln(x46+2*x38) + (x35*x24 + exp(x87 + x56))^2 - x34 + ...
+ .....
+ .....

keyword2
我想做的就是把这个大的数学表达式和它的组合项分开,然后把这些原子项存储在一个列表中,例如,如果它是负数,那么在和中出现的每个项都应该是-项

对于上述示例,应返回以下内容:

L = [x47*ln(x46+2*x38), (x35*x24 + exp(x87 + x56))^2, - x34, ...]
我会尝试使用一个正则表达式,它与+或-符号匹配,用于分隔它们之间的术语,但我认为这是错误的,因为它还将与+/-符号匹配,而+/-符号出现在我不想分隔的较小表达式中

所以我有点被这个触发了


提前感谢您帮助我解决问题,伙计们

我认为提取关键字之间的部分,正则表达式就可以了。在在线正则表达式创建者的帮助下,您应该能够创建它。然后你有一个字符串,里面有数学公式

实际上,您需要在括号“depth”为0的所有位置拆分字符串。例如,如果有x1*x2+x3+x4,则应忽略括号之间的+

我编写了以下函数,它搜索列表并跟踪当前的括号深度。如果深度为0且遇到+或-时,将存储索引。最后,我们可以在这些索引处拆分字符串,以获得所需的拆分。我首先编写了一个递归变量,但迭代变量也同样有效,可能更容易理解

递归函数 def find_split_indexesblock,索引=0,深度=0,索引=[]: 完全搜索字符串后返回 如果索引>=lenblock: 返回索引 遇到括号时更改深度 如果块[索引]=: 深度+=1 elif块[索引]==: 深度-=1 如果在深度0处遇到+或减号,则存储索引 如果深度==0且块[index]='+'或块[index]='-': 索引 最后返回索引列表 返回find_split_indexsblock,index+1,depth,index 迭代函数 当然,也可以创建一个使用该函数的循环版本的迭代,这可能更容易理解

def find_split_index_iterativeblock: 索引=[] 深度=0 迭代字符串 对于rangelenblock中的索引: 如果块[索引]=: 深度+=1 elif块[索引]==: 深度-=1 elif深度==0且块[索引]='+'或块[索引]='-': 索引 返回索引 使用索引
例如,要使用这些索引,可以按说明拆分字符串以获得所需的部分。唯一要做的就是删除前导空格和尾随空格。

谢谢您的快速回答,先生,我下午会试试!