我有以下read.json文件
{:{"JOL":"EuXaqHIbfEDyvph%2BMHPdCOJWMDPD%2BGG2xf0u0mP9Vb4YMFr6v5TJzWlSqq6VL0hXy07VDkWHHcq3At0SKVUrRA7shgTvmKVbjhEazRqHpvs%3D-%1E2D%TL/xs23EWsc40fWD.tr","LAPTOP":"error"}和python脚本:
import re
shakes = open("read.json", "r")
needed = open("needed.txt", "w")
for text in shakes:
if re.search('JOL":"(.+?).tr', text):
print >> needed, text,我希望它能找到两个单词(JOL":“和.tr)之间的内容,然后打印出来。但是它所做的只是打印"read.json“中设置的所有文本。
发布于 2014-11-21 20:28:43
您正在调用re.search,但除了检查是否存在匹配之外,您不会对返回的匹配进行任何操作。相反,您只是打印出原始的text。所以你当然知道整条线了。
解决方案很简单:只需将re.search的结果存储在变量中,就可以使用它。例如:
for text in shakes:
match = re.search('JOL":"(.+?).tr', text)
if match:
print >> needed, match.group(1)在您的示例中,匹配的是JOL":"EuXaqHIbfEDyvph%2BMHPdCOJWMDPD%2BGG2xf0u0mP9Vb4YMFr6v5TJzWlSqq6VL0hXy07VDkWHHcq3At0SKVUrRA7shgTvmKVbjhEazRqHpvs%3D-%1E2D%TL/xs23EWsc40fWD.tr,其中的第一个(也是唯一的)组是EuXaqHIbfEDyvph%2BMHPdCOJWMDPD%2BGG2xf0u0mP9Vb4YMFr6v5TJzWlSqq6VL0hXy07VDkWHHcq3At0SKVUrRA7shgTvmKVbjhEazRqHpvs%3D-%1E2D%TL/xs23EWsc40fWD,这就是您要寻找的(我认为)。
然而,有几点附带说明:
首先,.是正则表达式中的一个特殊模式,因此您实际上是在匹配任何字符,后面跟着的是tr,而不是.tr。为此,使用一个.来转义\。(一旦您开始将反斜杠放入regex中,则使用原始字符串文字。)因此:r'JOL":"(.+?)\.tr'.
第二,这是对数据的许多假设,这些假设可能是没有根据的。这里真正想要的不是“JOL":"和.tr之间的所有东西”,而是“JSON对象中与键'JOL'相关联的值”。唯一的问题是,这并不完全是一个JSON对象,因为它的前缀是:。希望您知道数据是从哪里得到的,因此它的格式是什么。例如,如果您知道它实际上是一个由冒号前缀的JSON对象组成的序列,解析它的正确方法是:
d = json.loads(text[1:])
if 'JOL' in d:
print >> needed, d['JOL']最后,代码中实际上没有任何名为needed的内容;您打开了一个名为'needed.txt'的文件,但是调用了文件对象love。如果您的真正代码有类似的错误,那么您可能会一遍又一遍地覆盖一个完全不同的文件,然后查看needed.txt,每次…都没有任何变化。
发布于 2014-11-21 20:56:01
如果您知道您的开始和结束匹配字符串只出现一次,则可以忽略它是JSON。如果可以,那么您可以在起始字符(JOL":")上拆分,接受拆分数组1的第二个元素,然后在结束字符(.tr)上再次拆分,并接受拆分数组的第一个元素。
>>> text = '{:{"JOL":"EuXaqHIbfEDyvph%2BMHPdCOJWMDPD%2BGG2xf0u0mP9Vb4YMFr6v5TJzWlSqq6VL0hXy07VDkWHHcq3At0SKVUrRA7shgTvmKVbjhEazRqHpvs%3D-%1E2D%TL/xs23EWsc40fWD.tr","LAPTOP":"error"}'
>>> text.split('JOL":"')[1].split('.tr')[0]
'EuXaqHIbfEDyvph%2BMHPdCOJWMDPD%2BGG2xf0u0mP9Vb4YMFr6v5TJzWlSqq6VL0hXy07VDkWHHcq3At0SKVUrRA7shgTvmKVbjhEazRqHpvs%3D-%1E2D%TL/xs23EWsc40fWD'https://stackoverflow.com/questions/27069680
复制相似问题