Ich habe einen folgenden Ausschnitt, in der Regel möchte ich arithmetischen Ausdruck (mit negativen Zahlen) zu Token teilen.Arithmetische Ausdrücke in Python mit Regexps teilen
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)
Und es gibt Problem mit Splitting negativen Zahlen mit diesem Code ausgegeben wird
Token(type='NUM', value='2')
Token(type='NUM', value='-2')
Aber soll
Token(type='NUM', value='2')
Token(type='MINUS', value='-')
Token(type='NUM', value='2')
Wie dieses Problem beheben?
Versuchen Sie, Ihre NUM-Gruppe nach der Gruppe MINUS zu setzen, so dass das Muster mit dem Minuszeichen zuerst übereinstimmt –
@PhuNgo Aber dann negative Zahlen nicht zusammenpassen. – paruwa
Fügen Sie eine Überprüfung hinzu (z. B. '(?! ^)'), Um sicherzustellen, dass ein Ausdruck nicht mit Operatoren beginnt –