본문 바로가기

언어/Python

[ Python ] re.Scanner를 이용해서 RPN 계산기 만들기

반응형

1. RPN (Reverse Polish Notation, 역 폴란드 표기법)

개요

RPN은 수식 표기법의 일종으로, 연산자를 피연산자 뒤에 위치시키는 표기법입니다. 일반적인 수식(중위 표기법)과 달리, 괄호 없이도 수식을 명확히 표현할 수 있어 계산기가 연산을 수행할 때 유용합니다.

예시

중위 표기법: 3 + 4 * 2 / ( 1 - 5 ) ^ 2 ^ 3

RPN 표기법: 3 4 2 * 1 5 - 2 3 ^ ^ / +

RPN에서 계산은 스택을 사용해 이루어집니다. 연산자를 만나면 스택에서 필요한 수만큼의 피연산자를 꺼내 계산하고, 결과를 다시 스택에 넣습니다.

RPN 계산기 구현 예제

def rpn_calculator(expression):
    stack = []
    for token in expression.split():
        if token.isdigit():
            stack.append(int(token))
        else:
            operand2 = stack.pop()
            operand1 = stack.pop()
            if token == '+':
                stack.append(operand1 + operand2)
            elif token == '-':
                stack.append(operand1 - operand2)
            elif token == '*':
                stack.append(operand1 * operand2)
            elif token == '/':
                stack.append(operand1 / operand2)
            elif token == '^':
                stack.append(operand1 ** operand2)
    return stack[0]

expression = "3 4 2 * 1 5 - 2 3 ^ ^ / +"
result = rpn_calculator(expression)
print(result)  # Output: 3.0001220703125

이 함수는 스택을 사용해 RPN 수식을 계산하는 간단한 예제입니다.

2. re.Scanner

개요

re.Scanner는 Python의 re 모듈에서 제공하는 클래스 중 하나로, 텍스트를 토큰화(tokenize)하는 데 유용합니다. re.Scanner를 사용하면 여러 개의 정규 표현식을 이용해 텍스트를 다양한 패턴으로 분할할 수 있습니다.

사용법

re.Scanner는 각 패턴에 대해 매칭되는 함수를 지정하고, 입력된 문자열을 해당 패턴으로 스캔하며 매칭되는 함수를 호출하여 토큰을 생성합니다.

예제

import re

def tokenize_integer(scanner, token):
    return 'INTEGER', int(token)

def tokenize_word(scanner, token):
    return 'WORD', token

def tokenize_space(scanner, token):
    return 'SPACE', None

scanner = re.Scanner([
    (r"\d+", tokenize_integer),
    (r"[a-zA-Z_]\w*", tokenize_word),
    (r"\s+", tokenize_space),
])

tokens, remainder = scanner.scan("42 apples and 100 oranges")

print(tokens)
print(remainder)

출력:

[('INTEGER', 42), ('WORD', 'apples'), ('WORD', 'and'), ('INTEGER', 100), ('WORD', 'oranges')]
''

이 예제에서는 숫자(\d+), 단어(\w+), 공백(\s+)을 각각 다른 방식으로 토큰화합니다. scanner.scan() 함수는 매칭된 토큰들의 리스트와 남은 문자열을 반환합니다.

re.Scanner는 입력 문자열을 세밀하게 분석하고 각 패턴에 따라 처리할 수 있는 유연한 방법을 제공합니다.

반응형