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

时间:2014-11-21 20:23:49

标签: python text

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

中的所有文本集

2 个答案:

答案 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'