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')
すべきですか?
MINUSグループの後ろにNUMグループを配置し、パターンがマイナス記号と最初に一致するようにしてください。 –
@PhuNgoしかし、負の数は一致しません。 – paruwa
式が演算子で始まらないことを確認するためのチェック(例えば '(?!^)')を追加する –