我正在尝试解析看起来像
的输入行8=FIX.4.2^A9=0126^A35=0^A34=000742599^A49=L3Q206N^A50=2J6L^A52=20130620-11:16:27.344^A369=000733325^A56=CME^A57=G^A142=US,IL^A1603=OMS2^A1604=0.1^A
您有不同的数据字段,由^ A分隔。我试图得到各个数据字段(如8 = FIX.4.2,9 = 0126,35 = 0等)。问题是python有时将^ A解释为单个字符(在vim中这是ctrl-v,ctrl-a),有时将字符'^ A'解释为有两个字符。所以我尝试过做
entries = re.split('^A|^A', str(line))
但后来我做的时候
for entry in entries:
print entries
我最后得到原始字符串,没有任何分裂。这是re.split的问题吗?
答案 0 :(得分:5)
取决于该行包含的内容。
如果要拆分2个字符的字符串'^A'
,请转义特殊到正则表达式字符^
,在这种情况下可能意味着'\^A'
。
这更像是以caret notation方式打印字节值为0x01的单个字符,在这种情况下,您可能希望在'\x01'
上拆分。
(你也可以使用字符串自己的split()
函数,我猜它比使用正则表达式这样简单快了。
答案 1 :(得分:4)
^
在正则表达式中具有特殊含义,因此您应该首先将其转义。
>>> strs = "8=FIX.4.2^A9=0126^A35=0^A34=000742599^A49=L3Q206N^A50=2J6L^A52=20130620-11:16:27.344^A369=000733325^A56=CME^A57=G^A142=US,IL^A1603=OMS2^A1604=0.1^A"
>>> re.split('\^A',strs)
['8=FIX.4.2', '9=0126', '35=0', '34=000742599', '49=L3Q206N', '50=2J6L', '52=20130620-11:16:27.344', '369=000733325', '56=CME', '57=G', '142=US,IL', '1603=OMS2', '1604=0.1', '']
来自docs:
'^' : (Caret.) Matches the start of the string, and in MULTILINE mode also
matches immediately after each newline.
答案 2 :(得分:3)
^
是一个元字符,它只匹配字符串的 start 。逃避它:
>>> re.split('\^A', line)
['8=FIX.4.2', '9=0126', '35=0', '34=000742599', '49=L3Q206N', '50=2J6L', '52=20130620-11:16:27.344', '369=000733325', '56=CME', '57=G', '142=US,IL', '1603=OMS2', '1604=0.1', '']
您的表达式中不需要使用|
,尤其是当两个“备用”字符串相同时不会。{/ p>
但是,您似乎拥有\x07
或\a
控制字符,而不是双字符^A
字符串。只需使用.split()
拆分该值,就不需要正则表达式:
>>> line = line.replace('^A', '\a')
>>> line
'8=FIX.4.2\x079=0126\x0735=0\x0734=000742599\x0749=L3Q206N\x0750=2J6L\x0752=20130620-11:16:27.344\x07369=000733325\x0756=CME\x0757=G\x07142=US,IL\x071603=OMS2\x071604=0.1\x07'
>>> line.split('\a')
['8=FIX.4.2', '9=0126', '35=0', '34=000742599', '49=L3Q206N', '50=2J6L', '52=20130620-11:16:27.344', '369=000733325', '56=CME', '57=G', '142=US,IL', '1603=OMS2', '1604=0.1', '']