解析regex中的FIX协议?

2024-05-23 22:57:49 发布

您现在位置:Python中文网/ 问答频道 /正文

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

每一行包含头信息(时间戳、日志记录级别、端点),后跟一个修复负载。

我使用regex将头信息解析为命名组。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 payload本身(^A是每个标记之间的分隔符),例如:

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

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

我知道有一个库可以解析每个标记(http://source.kentyde.com/fixlib/overview),但是,如果可能的话,我希望这里使用regex有一个简单的方法,因为我实际上只需要几个标记。

在regex中有没有好的方法来提取我需要的标记?

干杯, 维克多


Tags: 文件方法标记信息消息协议datetime记录
3条回答

使用像expresso或regexbuddy这样的regex工具。
为什么不在^A上进行拆分,然后为每个放入散列的元素匹配([^=])+=(.*)?您还可以使用一个开关进行筛选,该开关默认情况下不会添加您不感兴趣的标记,并且对于您感兴趣的所有标记都会失败。

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

不需要在“\x01”上拆分,然后在regex上拆分,然后再进行筛选。如果您只需要标记34、49和56(MsgSeqNum、SenderCompId和TargetCompId),那么可以使用regex:

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

如果您知道发送方没有可能导致任何简单正则表达式中出现错误的嵌入数据,那么这样的简单正则表达式将起作用。具体来说:

  1. 没有原始数据字段(实际上是数据len和原始数据的组合,如rawdataleng、Raw Data(95/96)或XmlDataLen、XmlData(212213)
  2. 没有用于unicode字符串的编码字段,如EncodedTextLen、EncodedText(354/355)

处理这些情况需要很多额外的解析。我使用一个定制的python解析器,但是即使您上面引用的fixlib代码也会出错。但是,如果您的数据没有这些异常,那么上面的regex应该会返回您所需字段的一个很好的dict。

编辑:我保留了上面的正则表达式,但应该对其进行修改,以便最终的match元素是(?=\x01)。这个解释可以在@tropleee的answer here中找到。

相关问题 更多 >