2011-11-21 82 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* 

然后我来到了FIX有效载荷本身(^ A是每个标签之间的分隔符),例如:

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

我需要从这个(如“A”从提取特定标签35 =或从11 =开始的“blahblah”),并忽略所有其他的东西 - 基本上我需要在“35 = A”之前忽略任何内容,以及在“11 = blahblah”之后的任何内容,然后忽略任何内容等。

我知道那里有一个库可能能够解析每一个标签(http://source.kentyde.com/fixlib/overv但是,如果可能的话,我希望在这里使用正则表达式,因为我真的只需要几个标签。

有没有在正则表达式中提取我需要的标签的好方法?

干杯, 维克多

回答

0

使用像快报或使用RegexBuddy正则表达式的工具。
你为什么不分裂^A然后匹配([^=])+=(.*)为每一个把他们放进一个散列?您也可以使用开关进行过滤,默认情况下不会添加您不感兴趣的标签,并且对您感兴趣的所有标签有所降低。

1

^A实际上是\ x {01},这就是它在vim中的表现。在perl中,我通过十六进制1进行分割,然后在“=”分割,在第二个分割中,数组的值[0]是标签,值[1]是值。

9

不需要分割“\ x01”然后regex然后过滤。如果你想只是标签34,49和56(MsgSeqNum,SenderCompId和TargetCompId),你可以正则表达式:如果你知道你的发件人没有嵌入了可能导致错误的数据

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

这样简单的正则表达式将工作任何简单的正则表达式。具体做法是:

  1. 否原始数据字段(实际上数据的组合Len和像RawDataLength,RAWDATA(95/96)或XmlDataLen,XMLDATA原始数据(212213)
  2. 为Unicode字符串等EncodedTextLen,EncodedText无编码栏(355分之354)

处理这些案件需要很多额外的解析中,我使用自定义的Python语法分析器,但即使你上面提到的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