在文件中搜索分隔字符串 - Python



>我有以下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'

最新更新