Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python에서 scanf() 메서드를 시뮬레이션하는 방법 완벽 가이드

Python 공식 문서가 말하는 scanf()의 부재

Python 공식 문서에 따르면, Python에는 현재 C언어의 scanf()와 동일한 기능을 제공하는 내장 함수가 존재하지 않습니다. 대신 정규 표현식(Regular Expression)을 사용하는 것이 일반적입니다. 정규 표현식은 scanf() 형식 문자열보다 훨씬 강력한 기능을 제공하지만, 그만큼 문법이 길고 복잡해질 수 있다는 단점도 있습니다.

아래 표는 scanf() 형식 토큰과 이에 대응하는 정규 표현식 간의 매핑 관계를 정리한 것입니다. 이 표를 참고하면 기존 C 코드의 scanf() 패턴을 Python 정규 표현식으로 손쉽게 변환할 수 있습니다.

scanf() 형식 토큰과 정규 표현식 매핑표

scanf() 토큰정규 표현식
%c.
%5c.{5}
%d[-+]?\d+
%e, %E, %f, %g[-+]?(\d+(\.\d*)?|\.\d+)([eE][-+]?\d+)?
%i[-+]?(0[xX][\dA-Fa-f]+|0[0-7]*|\d+)
%o[-+]?[0-7]+
%s\S+
%u\d+
%x, %X[-+]?(0[xX])?[\dA-Fa-f]+

실전 예제: 문자열에서 파일명과 숫자 추출하기

예를 들어, 다음과 같은 문자열에서 파일명과 에러·경고 개수를 추출하고 싶다고 가정해 보겠습니다.

/usr/sbin/sendmail - 0 errors, 4 warnings

C언어에서는 다음과 같은 scanf() 형식 문자열을 사용했을 것입니다.

%s - %d errors, %d warnings

이를 Python의 정규 표현식으로 변환하면 다음과 같습니다.

(\S+) - (\d+) errors, (\d+) warnings

Python 코드로 직접 적용하기

변환된 정규 표현식을 Python의 re 모듈과 함께 사용하면 다음과 같이 원하는 값을 추출할 수 있습니다.

import re

pattern = r"(\S+) - (\d+) errors, (\d+) warnings"
text = "/usr/sbin/sendmail - 0 errors, 4 warnings"

match = re.match(pattern, text)
if match:
    filename, errors, warnings = match.groups()
    print(filename)  # /usr/sbin/sendmail
    print(errors)    # 0
    print(warnings)  # 4

괄호 ()로 묶인 부분은 캡처 그룹(capture group)이 되어, match.groups() 메서드를 통해 각각의 값을 튜플 형태로 얻을 수 있습니다. 이처럼 정규 표현식을 활용하면 scanf()의 모든 기능을 유연하게 대체할 수 있으며, 필요에 따라 더 복잡한 파싱 로직도 자유롭게 구현할 수 있습니다.