我有以下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"。
中的所有文本集答案 0 :(得分:0)
您正在呼叫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
,而不是{{1 }}。为此,请使用.tr
转义.
。 (并且,一旦你开始将反斜杠放入正则表达式,请使用原始字符串文字。)所以:\
。
其次,这是对可能无法保证的数据做出很多假设。你真正想要的不是" r'JOL":"(.+?)\.tr'
和JOL":"
"之间的所有内容,它是"与关键.tr
相关联的值JSON对象"。唯一的问题是,这不是一个非常JSON的对象,因为前缀为'JOL'
。希望你知道从哪里获得数据,以及它实际上是什么格式。例如,如果你知道它实际上是一系列以冒号为前缀的JSON对象,解析它的正确方法是:
:
最后,您的代码中实际上没有任何名为d = json.loads(text[1:])
if 'JOL' in d:
print >> needed, d['JOL']
的内容;您打开了一个名为needed
的文件,但是您调用了文件对象'needed.txt'
。如果您的真实代码有类似的错误,那么您可能反复覆盖一些完全不同的文件,然后查看love
并且每次都看不到任何更改...
答案 1 :(得分:0)
如果你知道你的起始和结束匹配字符串只出现一次,你可以忽略它的JSON。如果确定,那么你可以拆分起始字符(JOL":"),取分裂数组的第2个元素[1],然后再分割结束字符(.tr)并获取split数组[0]的第一个元素。
>>> 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'