2015-08-24 37 views
-1

我试图捕捉消息的多个模式如下:捕获多个模式

line ="8=FIX.4.4^A9=0424^A35=W^A49=BROKER02^A56=FIRM01^A52=20120525-11:41:31.421^A34=000003^A55=USD/JPY^A262=1^A268=6^A269=0^A270=79.513^A271=500000^A299=869589960^A5020=20120529^A269=0^A270=79.511^A271=500000^A299=869589961^A5020=20120529^A269=0^A270=79.507^A271=1000000^A299=869589962^A5020=20120529^A269=1^A270=79.517^A271=500000^A299=869589963^A5020=20120529^A269=1^A270=79.519^A271=500000^A299=869589964^A5020=20120529^A269=1^A270=79.523^A271=1000000^A299=869589965^A5020=20120529^A10=191^A" 

p1 = re.compile(r'(55=.*?)\^A') 
p2 = re.compile(r'(55=.*?)\^A+(299=.*?)\^A+(5020=.*?)\^A') 
ret1 = re.findall(p1, line) 
ret2 = re.findall(p2, line) 

对于P1和P2,我希望RET1应该是相同的RET2的第一部分。然而,我得到的是:

['55=USD/JPY'] 
[('55=USD/JPY^A262=1^A268=6^A269=0^A270=79.513^A271=500000', '299=869589960', '5020=20120529')] 

这是为什么?为什么第一部分捕获超过^ A? 谢谢!

+0

这是没有意义的实现你想要的。 '(55 =。*?)\^A'不符合'55 =美元/日元' – sln

回答

0

为什么第一部分捕获超过^ A?

这是因为.*?终止条件不^A\^A+(299=.*?)\^A+(5020=.*?)\^A。所以它不会停止在第一^A但它会暂时向前迈进,停车时有299 etc在它前面的^A

Read More Here

您可以通过使用

(55=.*?)\^A.+?(299=.*?)\^A+(5020=.*?)\^A 

See demo.

+0

谢谢!现在我修改为:p2 = re.compile(r'(55 =。*?)\^A。*?(299 =。*?)\^A。*?(5020 =。*?)\^A' ),现在可以。 – Sarah

+0

@Sarah检查工作演示编辑。 – vks