2013-05-13 71 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']