首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在文件中搜索分隔字符串- Python

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

Stack Overflow用户
提问于 2014-11-21 20:23:49
回答 2查看 755关注 0票数 0

我有以下read.json文件

代码语言:javascript
复制
{:{"JOL":"EuXaqHIbfEDyvph%2BMHPdCOJWMDPD%2BGG2xf0u0mP9Vb4YMFr6v5TJzWlSqq6VL0hXy07VDkWHHcq3At0SKVUrRA7shgTvmKVbjhEazRqHpvs%3D-%1E2D%TL/xs23EWsc40fWD.tr","LAPTOP":"error"}

和python脚本:

代码语言:javascript
复制
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“中设置的所有文本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-11-21 20:28:43

您正在调用re.search,但除了检查是否存在匹配之外,您不会对返回的匹配进行任何操作。相反,您只是打印出原始的text。所以你当然知道整条线了。

解决方案很简单:只需将re.search的结果存储在变量中,就可以使用它。例如:

代码语言:javascript
复制
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对象组成的序列,解析它的正确方法是:

代码语言:javascript
复制
d = json.loads(text[1:])
if 'JOL' in d:
    print >> needed, d['JOL']

最后,代码中实际上没有任何名为needed的内容;您打开了一个名为'needed.txt'的文件,但是调用了文件对象love。如果您的真正代码有类似的错误,那么您可能会一遍又一遍地覆盖一个完全不同的文件,然后查看needed.txt,每次…都没有任何变化。

票数 1
EN

Stack Overflow用户

发布于 2014-11-21 20:56:01

如果您知道您的开始和结束匹配字符串只出现一次,则可以忽略它是JSON。如果可以,那么您可以在起始字符(JOL":")上拆分,接受拆分数组1的第二个元素,然后在结束字符(.tr)上再次拆分,并接受拆分数组的第一个元素。

代码语言:javascript
复制
>>> 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'
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27069680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档