3

我正在尝试在 python 中编写一个正则表达式,其中涉及的字符之一是 \001 字符。将 \001 放入字符串中似乎不起作用。我也试过'string' + str(chr(1)),但正则表达式似乎没有抓住它。请看在上帝的份上,有人帮助我,我整天都在为此苦苦挣扎。

import sys
import postgresql
import re

if len(sys.argv) != 2:
    print("usage: FixToDb <fix log file>")
else:
    f = open(sys.argv[1], 'r')
    timeExp = re.compile(r'(\d{2}):(\d{2}):(\d{2})\.(\d{6}) (\S)')
    tagExp = re.compile('(\\d+)=(\\S*)\001')
    for line in f:
        #parse the time
        m = timeExp.match(line)
        print(m.group(1) + ':' + m.group(2) + ':' + m.group(3) + '.' + m.group(4) + ' ' + m.group(5));
        tagPairs = re.findall('\\d+=\\S*\001', line)
        for t in tagPairs:
            tagPairMatch = tagExp.match(t)
            print ("tag = " + tagPairMatch.group(1) + ", value = " + tagPairMatch.group(2))

这是输入的示例行。为了便于阅读,我将 '\001' 字符替换为 '~'

15:32:36.357227 R 1 0 0 0 8=FIX.4.2~9=0067~35=A~52=20120713-19:32:36~34=1~49=PD~56=P~98=0~ 108=30~10=134

输出:

15:32:36.357227 R 标签 = 8,值 = FIX.4.29=006735=A52=20120713-19:32:3634=149=PD56=P98=0108=3010=134

所以它不会停留在 '\001' 字符处。

4

3 回答 3

2

chr(1)应该可以正常"\x01"工作"\001"。(请注意,它chr(1)已经返回了一个字符串,因此您不需要这样做str(chr(1))。)在您的示例中,看起来您同时拥有and "\001" chr(1)因此除非您的数据中连续有两个字符,否则这将不起作用。

您说正则表达式“似乎没有抓住它”,但是您没有给出输入数据的示例,因此无法说出原因。

编辑; 好的,看起来问题与\001. 这是经典的贪心问题。您的\S*tagExp 表达式中的 将匹配一个\001字符(因为该字符不是空格。所以\S*正在吞噬整行。\S*?用于使其不贪婪。

编辑:正如其他人所指出的,您的反斜杠看起来也有问题。在正则表达式中,您面临一个反斜杠加倍的问题:Python 使用反斜杠作为它自己的字符串转义符(如\t制表符、\n换行符),但正则表达式也将反斜杠用于它们自己的目的(例如,\s用于空格)。"\001"通常的解决方案是使用原始字符串,但如果您想使用转义,则不能这样做。但是,您可以为您的timeExp正则表达式使用原始字符串。然后在您的其他正则表达式中,将反斜杠加倍(除了 on \001,因为您希望将其解释为字符代码转义)。

于 2012-07-30T18:40:11.637 回答
1

而不是使用\S来匹配可以是任何非空白字符的值,包括\001,您应该使用[^\x01],它将匹配任何不是 的字符\001

于 2012-07-30T19:20:23.917 回答
0

@Sam Mussmann,不...

1(十进制) = \001 (八进制) <> \x01 (UNICODE)

于 2015-01-27T10:32:00.233 回答