이번 글에서는 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!
댓글남기기