Python re.sub返回二进制字符

时间:2014-11-18 17:41:02

标签: python regex

我正在尝试使用Python中的re.sub()regex表达式修复JSON提要。 (我也在与饲料提供商合作修复它)。我有两个要修复的表达式:

1

      "milepost":       "
      "milepost":       "723.46

缺少最终报价,

2

    },

}

不应该有逗号。注意,它们之间没有空行,只是“},\ n}”(这个编辑器有问题...)

我有一小段Feed,位于: http://hardhat.ahmct.ucdavis.edu/tmp/test.txt

以下示例代码。在这里,我有找到模式的测试,然后进行替换。 #2的匹配给出了一些奇怪的结果,但我不明白为什么: 找到大括号匹配: [('}','\ r \ n}')]

#1的比赛似乎很好。

主要问题是,当我执行re.sub时,我生成的字符串中包含“\ x01 \ x02”。我不知道这是从哪里来的。任何建议都非常感谢。

示例代码:

import urllib2
import json
import re

if __name__ == "__main__":
    # wget version of real feed:
    # url = "http://hardhat.ahmct.ucdavis.edu/tmp/test.json"
    # Short text, for milepost and brace substitution test:
    url = "http://hardhat.ahmct.ucdavis.edu/tmp/test.txt"
    request = urllib2.urlopen(url)
    rawResponse = request.read()
    # print("Raw response:")
    # print(rawResponse)

    # Find extra comma after end of records:
    p1 = re.compile('(}),(\r?\n *})')
    l1 = p1.findall(rawResponse)
    print("Brace matches found:")
    print(l1)

    # Check milepost:
    #p2 = re.compile('( *\"milepost\": *\")')
    p2 = re.compile('( *\"milepost\": *\")([0-9]*\.?[0-9]*)\r?\n')
    l2 = p2.findall(rawResponse)
    print("Milepost matches found:")
    print(l2)

    # Do brace substitutions:
    subst = "\1\2"
    response = re.sub(p1, subst, rawResponse)

    # Do milepost substitutions:
    subst = "\1\2\""
    response = re.sub(p2, subst, response)
    print(response)

1 个答案:

答案 0 :(得分:2)

您需要使用原始字符串,或者"\1\2"将由Python字符串处理器解释为ASCII 01 ASCII 02而不是backslash 1 backslash 2

而不是

subst = "\1\2"

使用

subst = r"\1\2" # or subst = "\\1\\2"

第二次替换事情变得有点棘手:

subst = "\1\2\""

需要成为

subst = r'\1\2"' # or subst = "\\1\\2\""