2013-05-13 96 views
4

我有一堆存储为字符串的数学表达式。这里有一个短的一个Python:将一个字符串划分为子字符串

stringy = "((2+2)-(3+5)-6)" 

我想起来打破这个字符串转换为仅包含在每个“子括号短语”的信息的列表,所以(我敢肯定有一个更好的方式来短语。)我的收益率将是:

['2+2','3+5'] 

我有几个关于如何做到这一点的想法,但我一直运行到一个“好了,现在该怎么办”的问题。

例如:

for x in stringy: 
    substring = stringy[stringy.find('('+1 : stringy.find(')')+1] 
    stringlist.append(substring) 

作品只是桃色返回2 + 2,但这就是尽可能去,我就如何通过移动其余完全消隐...

+5

写的实际的解析器。 (使用[pyparsing](http://pyparsing.wikispaces.com/)或[Parsley](https://pypi.python.org/pypi/Parsley)或[ANTLR](http://www.antlr3.org /)或其他) – millimoose 2013-05-13 22:30:24

+0

但是这个问题在O(n)中是可以解决的,因为它可以减少到常规语法的字问题,而解析器至少需要O(n^3),因为它需要无上下文语法。解析器可以写更多的代码 - 但确实是更清晰的... – 2013-05-13 22:34:53

+1

你想要做什么,比如'((2 *(2 + 2)) - (3 + 5)-6)'?你应该得到2 *(2 + 2),2 + 2还是两者都不是? – abarnert 2013-05-13 22:36:27

回答

2

一种方法使用正则表达式:

import re 
stringy = "((2+2)-(3+5)-6)" 
for exp in re.findall("\(([\s\d+*/-]+)\)", stringy): 
    print exp 

输出

2+2 
3+5 
1

你可以使用正则表达式如下所示:

import re 

x = "((2+2)-(3+5)-6)" 

re.findall(r"(?<=\()[0-9+/*-]+(?=\))", x) 

结果:

['2+2', '3+5'] 
相关问题