使用regexp

时间:2016-09-04 10:43:04

标签: python regex parsing

我有一个以下片段,通常我想将算术表达式(带负数)分割为标记。

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')

如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

我认为最简单的方法就是通过用空格分隔每个部分来创建表达式。

离。

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

问题是计算机不知道你忘了在“2-2”表达式中添加减号,或者如果你想减去2 - 2,这将是0.我认为它应该是'是一个问题,只是具体说明如何给出输入的方式。