在正则表达式中解析FIX协议?

时间:2011-11-21 05:35:59

标签: python regex fix-protocol

我需要解析包含FIX协议消息的日志文件。

每一行都包含标题信息(时间戳,日志记录级别,端点),后跟FIX有效负载。

我已使用正则表达式将标头信息解析为命名组。 E.g:

 <?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...

我需要从中提取特定标签(例如&#34; A&#34;来自35 =,或&#34; blahblah&#34;来自11 =),并忽略所有其他内容 - 基本上我需要在&#34; 35 = A&#34;之前忽略任何事情,以及在&#34; 11 = blahblah&#34;之后的任何事情,然后忽略之后的任何事情等。

我知道有一个库可能能够解析每个标签(http://source.kentyde.com/fixlib/overview),但是,我希望在可能的情况下使用正则表达式的简单方法,因为我真的只需要几个标签。

正则表达式是否有一种很好的方法来提取我需要的标签?

干杯, 维克多

3 个答案:

答案 0 :(得分:9)

无需拆分“\ x01”然后正则表达式然后过滤。如果你只想标记34,49和56(MsgSeqNum,SenderCompId和TargetCompId)你可以正则表达式:

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

如果您知道您的发件人没有可能导致任何简单正则表达式中的错误的嵌入数据,那么这样的简单正则表达式将起作用。具体做法是:

  1. 没有原始数据字段(实际上是数据len和原始数据的组合,如RawDataLength,RawData(95/96)或XmlDataLen,XmlData(212,213)
  2. 没有像EncodedTextLen,EncodedText(354/355)这样的unicode字符串的编码字段
  3. 要处理这些情况需要进行大量额外的解析。我使用自定义python解析器,但即使你上面引用的fixlib代码也会出现这些错误。但是,如果您的数据清除了这些异常,则上面的正则表达式应返回您所需字段的精确字典。

    编辑:我已按原样保留上述正则表达式,但应对其进行修改,以使最终匹配元素为(?=\x01)。可以在@ tropleee的answer here中找到解释。

答案 1 :(得分:1)

^ A实际上是\ x {01},这就是它在vim中的显示方式。在perl中,我通过十六进制1上的拆分然后在“=”上拆分,在第二次拆分时,数组的值[0]是标记,值[1]是值。

答案 2 :(得分:0)

使用像expresso或regexbuddy这样的正则表达式工具 为什么不在^A上拆分,然后匹配([^=])+=(.*)每个人将它们放入哈希?您还可以使用一个开关进行过滤,默认情况下,该开关不会添加您不感兴趣的标签,并且会对您感兴趣的所有标签产生影响。