2011-05-15 5 views
5

얼마 전에 cables which WikiLeaks released에 대해 BNF-based grammar을 작성하기 시작했습니다. 그러나 나는 이제 나의 접근 방식이 최고가 아니 었음을 깨달았으며 약간의 개선을 기대하고있다.WikiLeaks 케이블 용 내결함성 Python 기반 파서

cabe는 세 부분으로 구성됩니다. 머리 부분에는 RFC2822 스타일 형식이 있습니다. 이 구문 분석은 일반적으로 정확합니다. 텍스트 부분에는 좀 더 비공식적 인 명세가 있습니다. 예를 들어 REF 행이 있습니다. 이것은 REF:으로 시작해야하지만 다른 버전을 발견했습니다. 다음 정규식은 대부분의 경우를 포착합니다 : ^\s*[Rr][Ee][Ff][Ss: ]. 그래서 앞쪽에 공백이 있고, 다른 경우 등등. 텍스트 부분은 대부분 특별한 형식의 제목이있는 일반 텍스트입니다.

우리는 각 필드 (날짜, REF 등)를 인식하고 데이터베이스에 넣기를 원합니다. Pythons SimpleParse를 선택했습니다. 현재 파싱은 인식하지 못하는 각 필드에서 멈 춥니 다. 우리는 이제 내결함성이있는 솔루션을 찾고 있습니다. 모든 필드에는 어떤 종류의 순서가 있습니다. 파서가 필드를 인식하지 못하면 파서는 현재 필드에 'not recognized'-blob을 추가하고 계속 진행해야합니다. (또는 어쩌면 당신은 더 나은 접근법을 가지고 있습니다).

어떤 종류의 파서 또는 다른 종류의 해결책을 제안 하시겠습니까? 주위에 더 좋은 점이 있습니까?

+1

파서가 필요 하신가요? 케이블 구조에 대해 설명한 내용은 유형 3 언어 (촘스키의 분류에서와 같이)로 들리는데, 이는 렉서 (예 : flex) 또는 정규식은 케이블을 "파싱"하는 수단입니다. – phynfo

+0

각 헤더 토큰에'/ not_recognized'를 추가하지 않는 이유는 무엇입니까? –

+0

정말 파서가 필요한지 잘 모르겠습니다. 정규 표현식보다 읽기 쉽습니다. 그것을 부탁 드린다. 나는 굴곡을 보게 될 것이다. – qbi

답변

1

나는 케이블을 보지 않았지만 유사한 문제를 고려하고 옵션을 고려해 볼 수 있습니다. RFC에 대한 구문 분석기를 쓰고 싶습니다. RFC 형식이 필요한 RFC가 있지만 모든 RFC가 따르는 것은 아닙니다. 진행을 중단 할 이상치 - - 당신이 엄격한 파서를 썼다면

, 당신은 당신이로 실행 한 상황으로 실행하겠습니다이 경우 두 가지 옵션이있어 :

  1. 그들을 분할을 엄격하게 형식화 된 그룹과 그렇지 않은 그룹으로 나뉩니다. 엄격한 파서를 써서 낮은 매달린 과일을 얻고 최상의 옵션이 무엇인지 수치 이상으로 계산하십시오 (손 가공, 이상한 파서 등)

  2. 두 그룹의 크기가 같거나 표준 형식보다 많은 이상 값 - 유연한 구문 분석기 작성 이 경우 正規 표현식은 일련의 유연한 정규 표현식을 찾는 전체 파일을 처리 할 수 ​​있으므로 정규 표현식이 더 유용 할 것입니다. 정규 표현식 중 하나가 실패하면 아웃 라이어 목록을 쉽게 생성 할 수 있습니다. 하지만 일련의 정규식에 대해 검색을 할 수 있으므로 각 정규식에 대해 합격/불합격 행렬을 작성할 수 있습니다.

'퍼지'데이터의 경우 일부는 형식을 따르고 그렇지 않은 경우에는 정규식 접근 방식을 선호합니다. 그게 나 일 뿐이야. (예, 느리지 만 각 일치 세그먼트 사이의 관계를 조작하여 모든 구석에 맞는 단일 쿼리 (또는 파서)가 인간이 생성 한 입력을 처리 할 때 악몽입니다. ​​