2015-08-24 35 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