-1

我正在尝试解析看起来像的输入行

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 的问题吗?

4

3 回答 3

5

取决于该行包含的内容。

如果要拆分 2 个字符的字符串'^A',请转义 special-to-regexps 字符^,在这种情况下可能意味着'\^A'.

这更有可能是打印字节值为 0x01 的单个字符的插入符号表示法'\x01',在这种情况下,您可能希望改为拆分。

(你也可以使用字符串自己的split()函数,我猜它比使用正则表达式更快)

于 2013-06-25T15:07:12.650 回答
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', '']

来自文档

'^' : (Caret.) Matches the start of the string, and in MULTILINE mode also
               matches immediately after each newline.
于 2013-06-25T14:44:41.800 回答
3

^是一个元字符,它只匹配字符串的开头。逃脱它:

>>> 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', '']

不需要|在表达式中使用 a,尤其是当两个“替代”字符串相同时。

但是,您似乎有\x07or\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', '']
于 2013-06-25T14:44:53.550 回答