이번 글에서는 C/C++의 sscanf와 같은 동작을 하는 패키지를 찾다 parse라는 패키지를 알게 되었고 이에 대한 내용을 정리하고자 합니다.

패키지 설치

먼저 아래의 명령어를 통해 parse라는 패키지를 설치해 주시기 바랍니다.

$ pip install parse

예제

정상 동작 유무를 확인하기 위해 먼저 아래의 예제를 수행해 보겠습니다.

parse 라는 함수를 호출하면서 2가지 문자열을 전달하였습니다. 첫 번째 인자로 문자열의 패턴을 입력하였고, 두 번째 인자로 추출하고자 하는 대상 문자열을 입력하였습니다.

from parse import *

r = parse("It's {}, I love it!", "It's spam, I love it!")
print(r)
print(r[0])

실행 결과는 다음과 같습니다.

<Result ('spam',) {}>
'spam'

위와 같이 파싱에 성공하면 파싱된 결과 값을, 실패의 경우 None값이 리턴됩니다.

패턴 컴파일

만약 패턴으로부터 데이터를 추출해야 할 문자열이 많을 경우, 패턴을 컴파일 하여 보다 빠르게 사용할 수 있습니다.

compile을 통해 물자열 패턴을 생성 후 parse를 통해 대상 문자열로부터 파싱을 합니다.

from parse import compile

p = compile("It's {}, I love it!")
print(p)

r = p.parse("It's spam, I love it!")
print(r)

실행 결과는 다음과 같습니다.

<Parser "It's {}, I love it!">
<Result ('spam',) {}>

아래의 또 다른 예를 보시면 compile은 기본적으로 대소문자 구분없이 동작합니다. parse에서 입력 패턴과 대소문자가 다르지만 동작하는 것을 확인할 수 있습니다.

from parse import compile

p = compile("It's {}, I love it!")
print(p)

r = p.parse("IT'S spam, I love it!")
print(r)

실행 결과는 다음과 같습니다.

<Parser "It's {}, I love it!">
<Result ('spam',) {}>

대소문자를 구분하도록 동작하게 하기 위해서는 compile에서 옵션으로 case_sensitive=True을 추가해 주어야 합니다.

from parse import compile

p = compile("It's {}, I love it!", case_sensitive=True)
print(p)

r = p.parse("IT'S spam, I love it!")
print(r)

실행 결과는 다음과 같습니다.

<Parser "It's {}, I love it!">
None

포맷 문법

포맷 문법은 기본적으로 아래와 같이 이름과 형식의 필드로 지원됩니다.

{[field name]:[format spec]}

간단히 예를 들어보겠습니다.

추출하고자 하는 값에 이름을 할당하여, 값을 추출하고 인덱스 대신에 이름을 사용하여 값을 참조 할 수 있습니다.

from parse import *

r = parse("Bring out the holy {item}", "Bring out the holy hand grenade")
print(r)
print(r.named)
print(r['item'])

실행 결과는 다음과 같습니다.

<Result () {'item': 'hand grenade'}>
{'item': 'hand grenade'}
hand grenade

또한 다차원 구조를 지원하여 아래와 같이도 사용할 수 있습니다.

from parse import *

r = parse("My quest is {quest[name]}", "My quest is to seek the holy grail!")
print(r)
print(r['quest'])
print(r['quest']['name'])

실행 결과는 다음과 같습니다.

<Result () {'quest': {'name': 'to seek the holy grail!'}}>
{'name': 'to seek the holy grail!'}
to seek the holy grail!

댓글남기기