我有一个以下片段,通常我想将算术表达式(带负数)分割为标记。
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 :(得分:0)
我认为最简单的方法就是通过用空格分隔每个部分来创建表达式。
离。
expr= '2 - -2'
Token(type='NUM', value='2')
Token(type='MINUS', value='-')
Token(type='NUM', value='-2')
问题是计算机不知道你忘了在“2-2”表达式中添加减号,或者如果你想减去2 - 2,这将是0.我认为它应该是'是一个问题,只是具体说明如何给出输入的方式。