2016-11-17 4 views
0

pythonインターピーターのように電卓を書く目的で、私の表現の妥当性をチェックしたいと思います。Python Search文字列の繰り返し演算子

繰り返し演算子の文字列をチェックしたいのですが、何かをキャッチしたくないだけです。それらが存在するかどうかを知るために、式が無効になります。

4 ++ - + 4が有効です。

4 *が-8無効

4-/7で、鉱山は、おそらくここで有効失敗した無効

4/-4です。

minutとplusは繰り返し使用できますが、 - *は無効です。 python interpeterの動作とほとんど同じです。 これは私がRegexとして持っているものですが、より簡単な解決法は歓迎です。

[*/^%\-+][*/^%] | [\-+*/^%][*/^%] 

Link

Basicially、演算子*/^%がいるかどうかをチェック - +のいずれかで再び

+0

どうかのを知っている有効条件が

string[i+1] in dictionary[string[i]]

ていると文字であなたの文字列をチェックするものとなります演算子はスペースで区切られていますか? –

+0

オペレータはスペースで区切られておらず、スペースにはスペースがありません(これについては触れておきますか) – Lumon

+0

'^^ 'は何を得なければなりませんか?猫?あなたの問題を再定義したいかもしれません:) – Jan

答えて

1

(マイナス及びプラスなし)*/^%ことにより、より簡潔なソリューションがあろうが先行又は続きます中置式のためのCFGまたはスタックベースのアプローチのいずれかです。しかし、あなたがハックして実験することができるものは、次の考えです。

そうのようなすべての演算子の積構築:あなたが見つけたとき

from itertools import product as p 
all=list(p('*/^%-+',repeat=2)) 
all=map(lambda x:''.join(x),all) 

invalids=[..write them by hand in here(hacky part)] 
valids=filter(lambda x:x not in invalids,all) 

そして今、あなたはあなたが2のウィンドウを使用して文字列をスキャンすることができます長さ2のすべての有効な操作が残っているとし、有効なものに属していない演算子のペアは、式が無効であると宣言して移動することができます。

別の方法として、ルールベースの方法があります。演算子をキーとする辞書を作成し、各演算子の値はそれに続くすべての演算子を保持するリストになります。

次に、あなたの問題は、私はあなたがCFGソリューションとその美しいを発見した場合は、私が

関連する問題