gpt4 book ai didi

regex - 在正则表达式中解析 FIX 消息

转载 作者:行者123 更新时间:2023-12-04 22:45:03 27 4
gpt4 key购买 nike

我找到了 Parsing FIX protocol in regex? 的第二个答案非常好,所以我试了一下。

这是我的代码。

new_order_finder1 = re.compile("(?:^|\x01)(11|15|55)=(.*?)\x01")
new_order_finder2 = re.compile("(?:^|\x01)(15|55)=(.*?)\x01")
new_order_finder3 = re.compile("(?:^|\x01)(11|15|35|38|54|55)=(.*?)\x01")

if __name__ == "__main__":
line = "20150702-05:36:08.687 : 8=FIX.4.2\x019=209\x0135=D\x0134=739\x0149=PINE\x0152=20150702-05:36:08.687\x0156=CSUS\x011=KI\x0111=N09080243\x0115=USD\x0121=2\x0122=5\x0138=2100\x0140=2\x0144=126\x0148=AAPL.O\x0154=1\x0155=AAPL.O\x0157=DMA\x0158=TEXT\x0160=20150702-05:36:08.687\x01115=Tester\x016061=9\x0110=087\x01"
fields = dict(re.findall(new_order_finder1, line))
print(fields)

fields2 = dict(re.findall(new_order_finder2, line))
print(fields2)

fields3 = dict(re.findall(new_order_finder3, line))
print(fields3)

这是输出
{'11': 'N09080243', '55': 'AAPL.O'}
{'55': 'AAPL.O', '15': 'USD'}
{'35': 'D', '38': '2100', '11': 'N09080243', '54': '1'}

看起来有些字段没有被正则表达式正确匹配。

这里有什么问题?

最佳答案

问题是由于 \x01最后消耗了\x01分隔符,这导致模式在与刚刚匹配的键值对相邻的键值对上总是失败,因为 (?:^|\x01)可以匹配。

使用输入的这个子字符串作为示例,匹配 new_order_finder3 :

\x0154=1\x0155=AAPL.O\x01
------------
X

如您所见,在成功匹配键值对后 54=1 ,它也消耗了 \x01并且永远无法匹配相邻的键值对。

解决此问题的方法不止一种。一种解决方案是放置 \x01最后在一个前瞻断言中,这样我们就可以确保 \x01结束键值对而不消耗它:
new_order_finder3 = re.compile("(?:^|\x01)(11|15|35|38|54|55)=(.*?)(?=\x01)")

输出现在包含所有预期字段:
{'11': 'N09080243', '38': '2100', '15': 'USD', '55': 'AAPL.O', '54': '1', '35': 'D'}

关于regex - 在正则表达式中解析 FIX 消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31198950/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com