결과를 좀더 구조화 시켜 리턴 받고자 하는 경우 파싱된 화학 기호와 관련 양을 좀더 논리적인 그룹으로 만드는 것이 좋다. 다행히도 pyparsing모듈은 이러한 목적에 맞는 Group클래스를 제공한다. elementRef선언을 elementRef = element + Optional( Word( digits ) )에서 다음과 같이 변경한다.elementRef = Group( element + Optional( Word( digits ) ) )
화학적인 기호로 그룹화된 결과를 얻을 수 있다.
파서를 이용하여 얻게 되는 좋은 점 중의 하나는 입력 텍스트에 대해 수행하는 타당성 검토이다. wt변수 계산에서 qty문자열이 모두 숫자임을 검사해야 할 필요가 없다는 점에 혹은 올바르지 않은 인자로 인해 발생하는 ValueError를 검사할 필요가 없다는 점에 주의할 것 .
HTML 분석기
마지막 예제로 간단한 HTML 분석기를 만들어 보자. 이것은 파서 표현식에 점수를 매기는 것과 같은 포괄적인HTML 파서는 아니다. 다행히도 대부분의 웹페이지에서 핵심적인 데이터를 추출하기 위한 완벽한 HTML 문법정의가 필요한 것은 아니다. 특히 CGI가 잗동으로 생성한 부분이나 다른 응용 프로그램에 대한 부분이 그렇다.
이 예제는 특정 웹 페이지에 맞춰 제작된 작은 파서로 데이터를 추출한다. 이 경우에 이 페이지는 NIST가 유지하고 있는 가용한 네트워크 타임 프로토콜(NTP)서버 리스트이다. 이 루틴은 어떤 NTP서버가 현재 가용한지를 나타내는 좀더 큰NTP클라이언트 프로그램 한 부분이 될 수도 있다.
HTML분석기를 만들기에 앞서 어떤 종류의 HTML 텍스를 처리하고자 하는지를 알아야 한다. 웹사이트를 방문하고 리턴되는 HTML소스를 보면 웹페이지에는 HTML테이블 내에 NTP서버의 IP주소와 이름이 나열되어 있다.
이름
IP주소
위치
time-a.nist.gov
129.6.15.28
NIST, Gaithersburg, Maryland
time-b.nist.gov
129.6.15.29
NIST, Gaithersburg, Maryland
이 테이블을 위해 HTML은 NTP서버 데이터를 만들기 위해
,
,
태그를 사용한다.
Name
IP Address
Location
time-a.nist.gov
129.6.15.28
NIST, Gaithersburg, Maryland
time-b.nist.gov
129.6.15.29
NIST, Gaithersburg, Maryland
...
이 테이블은 아주 커다란 HTML의 한 부분이다. Pyparsing을 사용하여 주어진 파서 표현식과 일치하는 텍스트를 스캔할 수 있고 전체 입력 텍스트의 한 부분에만 일치하는 파서 표현식을 정의할 수도 있다.
프로그램은 서버의 IP주소와 위치를 추출하므로 문법의 초점을 테이블의 열 방향에만 집중 시킬 수 있다.비 정상적이긴 하지만 패턴과 일치하는 값을 추출하고자 할 수도 있다.
IP address
location name
너무 일반적인 표현식은 두 번째의 2개의 열 대신에 첫 번째의 2개의 열에 대응하기 때문에
,
,
만큼 일반적인 것과 단지 일치하는 것 이상의 좀더 세부적인 규정을 원한다. 대신에 페이지의 테이블 데이터와 일치하지 않는 부분을 제거하는 좁은 의미의 탐색을 가능하게 하는 규정적인 IP주소를 사용하라.
IP주소를 만들기 위해서는 정수를 정의하고 그 다음에 사이에 마침표를 가진 네 개의 정수를 조합한다.
이 결과를 살펴보면 몇 가지를 바로 알 수 있다. 파서는 IP주소를 구분 마침표와 하위필드를 가진 각각의 토큰으로 기록한다는 것이 한 가지 이다. Pyparsing이 이 필드를 한 개의 문자열 토큰으로 조합하기 위해 파싱하는 동안 몇 가지 일을 할 수 있다면 참 좋을 것이다. Pyparsing Combine클래스는 이 일을 한다. IP주소에 대해 리턴되는 하나의 문자열 토큰을 얻기위해ipAddress정의를 다음과 같이 수정한다.
두 번째로 알 수 있는 것은 결과가 테이블의 열을 표시하는 HTML 태그를 열고 닫는 것을 포함하고 있다. 파싱이 진행되는 동안 이 태그가 중요한 반면에 태그 그 자체는 추출된 데이터에 관심을 두지 않는다. 리턴되는 토큰 데이터에서 이 들을 무시하려면 suppress메서드를 사용한다.
tdStart = Literal("
").suppress()
tdEnd = Literal("
").suppress()
예제 4
from pyparsing import *
import urllib
# NTP서버에 대한 기본적인 텍스트 패턴 정의
integer = Word("0123456789")
ipAddress = Combine( integer + "." + integer + "." + integer + "." + integer )
tdStart = Literal("
이제 성공적으로 NTP서버, IP주소 그리고 프로그램 변수를 성공적으로 추출해서 NTP클라이언트 프로그램은 파싱된 결과를 사용할 수 있다.
결론
Pyparisng은 재귀하향 파서를 만드는 기본적인 프레임 워크를 제공한다. 입력 문자열 스캐닝의 오버헤드 기능에 주의, 일치하는 않는 표현식 처리, 일치하는 것 중 가장 긴 것 선택하기, 콜백함수 호출, 그리고 파싱된 결과를 리턴하는 것이 이 파서의 내용에 속한다. 이로 인해 개발자는 문법 디자인과 이에 대응하는 토큰 처리 구현에만 집중할 수 있다.조합자로서의 pyparsing의 특징으로 인해 개발자는 응용프로그램을 간단한 토큰화 프로그램에서 복잡한 문법 처리기로 확장할 수 있다. 당신의 다음 파싱 프로젝트로 이를 활용하는 것은 아주 훌륭한 방법이다.