Так что я должен получить строку и иметь возможность разделить ее на множество токенов по порядку. поэтому, если моя строка 25 + 90 - x * z30, мой вывод должен быть Line: 25 + 90 - x * z30

Номер: 25

Пунктуация: +

Номер: 90

Пунктуация: -

Идентификатор: x

Пунктуация: *

Идентификатор: z30

В настоящее время мой код находится на очень ранних стадиях

txt = '25 + 90 - x * z30'

number = '[0-9]+'
identifier = '[a-zA-z][a-zA-Z0-9]*'
punctuation = '[(/*+)-]'

        id = re.search(identifier, txt)
        num = re.search(number, txt)
        punc = re.search(punctuation, txt)
        print('Line: ', txt)
        print('Identifier: ', id)
        print('Number: ', num)
        print('punctuation', punc)

Я не понимаю, как продолжать читать строку после первого поиска, чтобы получить следующий поиск для каждой категории, и как сделать так, чтобы они отображались по порядку. мне нужно сделать определенный цикл, чтобы это получилось? потому что в настоящее время я получаю только первый поиск для каждого и в том порядке, в котором он жестко закодирован

0
JJvao 14 Сен 2020 в 07:32

1 ответ

Лучший ответ

Один из способов - разбить строку на токены (подойдет txt.split()), а затем проверить каждый токен, чтобы увидеть, какому регулярному выражению он соответствует. Что-то вроде этого (непроверено).

print("Line:", txt)
for token in txt.split():
    id = re.search(identifier, token)
    num = re.search(number, txt)
    punc = re.search(punctuation, txt)
    if id and id.group(0) == token:   # there was a match, and the match was the whole token
        print("Identifier:", token)
    elif num and num.group(0) == token:
        print("Number:", token)
    elif punc and punc.group(0) == token:
        print("Punctuation:", token)
    else:
        print("Unrecognized:", token)

Есть способы сделать это лучше. Например, вы можете поместить свои регулярные выражения в словарь и перебирать его вместо написания цепочки if s.

0
kindall 14 Сен 2020 в 04:47