擅长:python、mysql、java
<p>不需要在“\x01”上拆分,然后在regex上拆分,然后再进行筛选。如果您只需要标记34、49和56(MsgSeqNum、SenderCompId和TargetCompId),那么可以使用regex:</p>
<pre><code>dict(re.findall("(?:^|\x01)(34|49|56)=(.*?)\x01", raw_msg))
</code></pre>
<p>如果您知道发送方没有可能导致任何简单正则表达式中出现错误的嵌入数据,那么这样的简单正则表达式将起作用。具体来说:</p>
<ol>
<li>没有原始数据字段(实际上是数据len和原始数据的组合,如rawdataleng、Raw Data(95/96)或XmlDataLen、XmlData(212213)</li>
<li>没有用于unicode字符串的编码字段,如EncodedTextLen、EncodedText(354/355)</li>
</ol>
<p>处理这些情况需要很多额外的解析。我使用一个定制的python解析器,但是即使您上面引用的fixlib代码也会出错。但是,如果您的数据没有这些异常,那么上面的regex应该会返回您所需字段的一个很好的dict。</p>
<p><strong>编辑:</strong>我保留了上面的正则表达式,但应该对其进行修改,以便最终的match元素是<code>(?=\x01)</code>。这个解释可以在@tropleee的<a href="https://stackoverflow.com/questions/31198950/parsing-fix-message-in-regex/31199578#31199575">answer here</a>中找到。</p>