2016-09-04 11 views
0

私は以下のスニペットを持っていますが、一般的には算術式を(負の数で)トークンに分割したいと思っています。Pythonの算術式を正規表現で分割する

import re 
import collections 

NUM  = r'(?P<NUM>-?\d+)' 
PLUS = r'(?P<PLUS>\+)' 
MINUS = r'(?P<MINUS>-)' 
TIMES = r'(?P<TIMES>\*)' 
DIVIDE = r'(?P<DIVIDE>/)' 
LPAREN = r'(?P<LPAREN>\()' 
RPAREN = r'(?P<RPAREN>\))' 
WS  = r'(?P<WS>\s+)' 

Token = collections.namedtuple('Token', ['type', 'value']) 

def generate_tokens(text): 

    pattern = re.compile('|'.join((NUM, PLUS, MINUS, TIMES, DIVIDE, LPAREN, RPAREN, WS))) 

    scanner = pattern.scanner(text) 
    for m in iter(scanner.match, None): 
     token = Token(m.lastgroup, m.group()) 

     if token.type != 'WS': 
      yield token 

expr = "2-2" 
out = [token for token in generate_tokens(expr)] 
for token in out: 
    print(token) 

そして、このコードの分割負の数に問題があり、出力は

Token(type='NUM', value='2') 
Token(type='NUM', value='-2') 

である。しかし、この問題を解決する方法

Token(type='NUM', value='2') 
Token(type='MINUS', value='-') 
Token(type='NUM', value='2') 

すべきですか?

+0

MINUSグループの後ろにNUMグループを配置し、パターンがマイナス記号と最初に一致するようにしてください。 –

+0

@PhuNgoしかし、負の数は一致しません。 – paruwa

+0

式が演算子で始まらないことを確認するためのチェック(例えば '(?!^)')を追加する –

答えて

0

最も簡単な方法は、各部分をスペースで区切って式を作成することです。

ex。

expr= '2 - -2' 
Token(type='NUM', value='2') 
Token(type='MINUS', value='-') 
Token(type='NUM', value='-2') 

問題は、あなたが「2-2」という表現にマイナス記号を追加するのを忘れましたwheterコンピュータdosen'tが知っているということですか、あなたは2減算するたかった場合 - 0 Iだろうこれは、2を入力をどのように与えるべきかを特定するだけでは問題ではないと思う。