2011-11-21 4 views
6

FIX 프로토콜 메시지가 포함 된 로그 파일을 구문 분석해야합니다.FIX 프로토콜을 정규식으로 파싱 하시겠습니까?

각 행에는 헤더 정보 (시간 소인, 로깅 레벨, 엔드 포인트)와 FIX 페이로드가 있습니다.

정규식을 사용하여 헤더 정보를 명명 된 그룹으로 구문 분석했습니다. 예 :

<?P<datetime>\d{2}/\d{2}/\d{2} \d{2}:\d{2}:\d{2}.\d{6}) (?<process_id>\d{4}/\d{1,2})\s*(?P<logging_level>\w*)\s*(?P<endpoint>\w*)\s* 
I는 다음 FIX 페이로드 자체 올

는 예 (^ A는 각 태그 사이의 분리이다) :이 (예를 들어, "A"부터 특정 태그를 추출해야

8=FIX.4.2^A9=61^A35=A...^A11=blahblah... 

35 =, 또는 11 =에서 "blahblah"), 다른 모든 것들을 무시합니다. 기본적으로 "35 = A"이전에는 아무것도 무시해야하며, "11 = blahblah"이후에는 아무것도 무시한 다음 그 후에 아무것도 무시합니다.

각 태그를 구문 분석 할 수있는 라이브러리가 있음을 알고 있습니다 (http://source.kentyde.com/fixlib/overv iew), 그러나 나는 정말로 단지 두 개의 태그 만 필요하기 때문에 가능한 경우 여기에서 정규식을 사용하는 간단한 접근 방법을 원했다.

정규식에서 필요한 태그를 추출하는 좋은 방법이 있습니까?

건배, 빅터

답변

0

는 프레소 또는 regexbuddy 같은 정규식 도구를 사용합니다.
^A으로 분할 한 다음 해시에 넣을 때마다 ([^=])+=(.*)과 일치시키지 않으시겠습니까? 또한 기본적으로 관심이없는 태그를 추가하지 않고 관심있는 모든 태그에 대해 태그를 추가하는 스위치로 필터링 할 수 있습니다.

1

^A는 실제로 \ x {01}입니다. 그것이 정력에 어떻게 나타나는지입니다. perl에서는 16 진수 1의 분할을 통해 이것을 수행 한 다음 두 번째 분할에서 "="의 분할을 수행하고 배열의 값 [0]은 태그이고 값 [1]은 값입니다.

9

"\ x01"을 나눌 필요없이 정규식을 걸러 낼 필요가 없습니다. 그냥 태그 원한다면 34,49, 56 (MsgSeqNum, SenderCompId 및 TargetCompId) 당신은 정규식 수 : 당신이 보낸 사람의 버그가 발생할 수있는 데이터를 포함하지 않는 알고있는 경우이 같은

dict(re.findall("(?:^|\x01)(34|49|56)=(.*?)\x01", raw_msg)) 

간단한 정규 표현식에 작동합니다 어떤 간단한 정규식. 구체적 :

  1. 없음 원시 데이터 필드 (실제 데이터의 조합 렌 및 RawDataLength, RAWDATA (95/96) 또는 XmlDataLen, XMLDATA 같은 원시 데이터 (EncodedTextLen, EncodedText 같은 유니 코드 문자열 212,213)
  2. 없음 인코딩 필드 (355분의 354)

이러한 경우를 처리하기 위해 추가 분석이 많이 걸립니다. 나는 정의 파이썬 파서하지만를 사용하는 경우에도 당신이 위에서 언급 한 fixlib 코드가 잘못 이러한 경우를 얻을 수 있습니다.하지만 당신의 데이터는 이러한 예외의 명확한 경우 위의 정규 표현식은 원하는 필드의 멋진 사전을 반환해야합니다.

편집 : 위의 정규 표현식은 그대로 두었지만 최종 일치 요소가 (?=\x01)이되도록 수정해야합니다. 설명은 @ tropleee의 answer here에서 찾을 수 있습니다.

+2

허용되는 답변보다 나은 답변입니다. 확실히 "len"필드를 고려해야합니다. 모두는 항상 이것들을 잊어 버립니다! 또한 FIX 메시지에는 줄 바꿈 문자 (태그 58)가 포함될 수 있으므로 re.DOTALL을 사용해야합니다. – noahlz

+2

[이 질문에 설명] (http://stackoverflow.com/questions/31198950/parsing-fix-message-in-regex/31199578#31199575)이 솔루션에는 버그가 있습니다. 두 개의 일치 항목이있는 경우 실패합니다 인접한. – tripleee

관련 문제