【问题标题】:regex with python正则表达式与 python
【发布时间】:2016-08-18 18:58:24
【问题描述】:

我想提取一个文件,它应该以[{"linkId":"changeDriveLink" 开头并以,"zone" 之前的文本结束

我的输入是:

[{"linkIdsd":"changeDridsdve [{"linkId":"changeDriveLink","url":"/drive
/3696434","zoneId":"forceAjax"},{"linkId":"printProductsFormSubst","url":"/drive/rayon.pagetemplate.substitutionlist.printproductsformsubst","zoneId":"forc
,"zone"

我想拥有:

[{"linkId":"changeDriveLink","url":"/drive
    /3696434","zoneId":"forceAjax"},{"linkId":"printProductsFormSubst","url":"/drive/rayon.pagetemplate.substitutionlist.printproductsformsubst","zoneId":"forc

请问我怎样才能通过正则表达式做到这一点?

【问题讨论】:

  • 请提供您的 json 输入的 MCVE 示例。
  • 谢谢,我编辑了我的问题,

标签: python regex python-2.7 preg-match


【解决方案1】:

正则表达式

re.compile(r'^\[\{"linkId":"changeDriveLink".*,"zone"', re.DOTALL)

应该这样做。中间的 .* 代表任何字符,re.DOTALL 确保即使换行符也匹配,以防您的 json 打印得很漂亮。

但我认为最好用json 包加载文件,然后检查它是否满足您的要求:

import json

with open('filename_here.json', 'r') as json_file:
    data = json.load(json_file)

if data[0]['linkId'] == 'changeDriveLink':
    # then its OK
else:
    # not OK

根据您给出的字符串,您的 json 是一个 list(数组),它的第一个元素是 dictdict 有一个 'linkId' 键,其值为 'changeDriveLink' .这就是我在if 语句中检查的内容。

编辑:

现在我明白你想要做什么了。 首先,您应该从表达式的开头省略 ^ 字符,因为您提供的字符串不是 json 文件的开头,它应该是结果的开头。 然后,你可以得到你想要的字符串,例如分组:

pattern = re.compile(r'.*(?P<result>\[\{"linkId":"changeDriveLink".*),"zone"', re.DOTALL)
match_obj = pattern.match('your_json_string')
if match_obj is not None:
    the_string_you_want = match_obj.group('result')

我在这里使用的称为命名分组,您可以在documentation中阅读更多信息

【讨论】:

  • 谢谢,我知道如何提取 json,我的问题是正则表达式,我测试了你的正则表达式,但它不起作用
  • 能否提供一些示例 json 文件?
  • 嗨,Máté,我添加了我需要的输入和输出,谢谢
【解决方案2】:

恕我直言,使用json 包并在结构中搜索比编写复杂的正则表达式更好,这将是不可读且很难调试的。

您可以访问此帖子 (Parsing json and searching through it) 了解更多想法。

【讨论】:

    猜你喜欢
    • 2010-09-12
    • 2011-08-06
    • 2011-01-04
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-18
    相关资源
    最近更新 更多