如何在python字符串中放置字符文本

2024-10-01 15:43:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图用python编写一个正则表达式,其中涉及的一个字符是\001字符。将\001放入字符串似乎不起作用。我也尝试了'string'+str(chr(1)),但regex似乎没有捕捉到它。上帝啊,有人帮帮我吧,我已经为此挣扎了一整天了。在

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=固定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转 标签=8,值=FIX。4.29=006735=A52=20120713-19:32:3634=149=PD56=P98=0108=3010=134

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


Tags: inimportreformatchsyslinegroup
3条回答

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

chr(1)应该可以工作,"\x01",也可以{}。(注意,chr(1)已经返回了一个字符串,因此您不需要str(chr(1))。)在您的示例中,您似乎同时拥有两个"\001"chr(1),因此,除非数据中的一行中有两个字符,否则无法工作。在

你说regex“似乎没有捕捉到”,但你没有给出输入数据的例子,因此无法说明原因。在

编辑;好的,看起来问题与\001无关。这是典型的贪婪问题。tagExp表达式中的\S*将匹配\001字符(因为该字符不是空白字符)。所以\S*正在吞噬整条线。使用\S*?使其非贪婪。在

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

@萨姆·穆斯曼,不。。。在

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

相关问题 更多 >

    热门问题