我正在尝试使用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)
答案 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\""