>我有以下read.json文件
{:{"JOL":"EuXaqHIbfEDyvph%2BMHPdCOJWMDPD%2BGG2xf0u0mP9Vb4YMFr6v5TJzWlSqq6VL0hXy07VDkWHHcq3At0SKVUrRA7shgTvmKVbjhEazRqHpvs%3D-%1E2D%TL/xs23EWsc40fWD.tr","LAPTOP":"error"}
和蟒蛇脚本:
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"中设置的所有文本。
您正在调用 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
。为此,请用逃离
.
.(而且,一旦您开始将反斜杠放入正则表达式中,请使用原始字符串文字。所以: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
,每次都看不到任何变化......
如果您知道开始和结束匹配的字符串只出现一次,则可以忽略它是 JSON。如果没问题,那么您可以在起始字符 (JOL":") 上拆分,获取拆分数组 [1] 的第 2 个元素,然后在结束字符 (.tr) 上再次拆分并获取拆分数组的第一个元素 [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'