我正在尝试在JSON Feed中查找并替换多行模式。基本上,我正在寻找以“}”结尾的行,后面跟着只有“}”的行。
示例输入为:
s = """
"essSurfaceFreezePoint": "1001",
"essSurfaceBlackIceSignal": "4"
},
}
}
"""
我想找到:
"""
},
}
"""
并将其替换为:
"""
}
}
"""
我尝试了以下内容:
pattern = re.compile(r'^ *},\n^ *}$',flags=re.MULTILINE)
pattern.findall(feedStr)
这适用于python shell。但是,当我在我的python程序中进行相同的搜索时,它什么也没找到。我在程序中使用完整的JSON提要。也许在阅读Feed时会有不同的行终止。
Feed位于:
http://hardhat.ahmct.ucdavis.edu/tmp/test.json
如果有人能指出为什么这在shell中工作,而不是在程序中,我会非常感激。有没有更好的方法来制定正则表达式,所以它可以在两者中工作?
感谢您的任何建议。
=============================================== ======================================
为了更清楚,我在这里添加我的测试代码。请注意,我现在包括Ahosan Karim Asik提供的正则表达式。这个正则表达式在下面的实时演示链接中工作,但在python shell中对我不起作用。它也不适用于真实的饲料。
再次感谢您的帮助。
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 :(得分:0)
试试这个:
import re
p = re.compile(ur'(^ *}),(\n^ *})$', re.MULTILINE)
test_str = u" \"essSurfaceFreezePoint\": \"1001\",\n \"essSurfaceBlackIceSignal\": \"4\"\n },\n }\n }"
subst = u"$1$2"
result = re.sub(p, subst, test_str)