【问题标题】:Regex Contains No Capture Groups?正则表达式不包含捕获组?
【发布时间】:2017-11-01 15:51:34
【问题描述】:

我有一系列格式错误的 JSON 数据,我需要使用 Regex 从中获取我需要的数据,然后我需要再次使用 regex 来删除数据的特定方面,即主要类别,在下面的例子是“游戏”。

第 1 部分有效,第二部分无效。

我对 Python 的经验有限,几乎没有使用 Regex 的经验。

最终输出:游戏

我收到了错误:

ValueError: 模式不包含捕获组

该系列数据包含如下格式的信息:

 {"urls":{"web":{"discover":"http://www.kickstarter.com/discover/categories/games/playing%20cards"}},"color":51627,"parent_id":12,"name":"Playing Cards","id":273,"position":4,"slug":"games/playing cards"}

我正在使用的 Python 调用是这样的:

首先我从 JSON 中删除 slug。

ksdata.cat_slug_raw = ksdata.category.str.extract('\"slug\"\:\"(.+?)\"', expand=False)

然后我删除 / 之前的所有内容

ksdata.cat_slug = ksdata.cat_slug_raw.str.extract('^[^/]+(?=/)', expand=False)

我真的很感谢我在哪里出错的一些帮助......如果你认为我的解决方案作为一个整体,请告诉我:)

【问题讨论】:

  • 为什么说这是格式错误的 JSON 数据?对我来说它看起来非常好。
  • 您期望的输出是什么?
  • 一方面,我建议使用原始字符串(在字符串前面添加r,例如r'^[^/]+(?=/)')以避免需要转义特殊字符。我只是发现在我的正则表达式中添加大量转义字符会更容易搞砸。
  • Split 为您提供项目列表,例如['games', 'playing_cards'],在 [0] 处的索引为您提供第一项
  • @TomSitter 使用 ksdata.cat_slug_raw.str.split('/').str[0] 而不是 ksdata.cat_slug_raw.str.split('/')[0] 看起来有效。

标签: python regex pandas


【解决方案1】:

你可以使用ast.literal_eval:

s = '{"urls":{"web":{"discover":"http://www.kickstarter.com/discover/categories/games/playing%20cards"}},"color":51627,"parent_id":12,"name":"Playing Cards","id":273,"position":4,"slug":"games/playing cards"}'
import ast
final_data = ast.literal_eval(s)

输出:

{'name': 'Playing Cards', 'color': 51627, 'slug': 'games/playing cards', 'parent_id': 12, 'urls': {'web': {'discover': 'http://www.kickstarter.com/discover/categories/games/playing%20cards'}}, 'position': 4, 'id': 273}

【讨论】:

  • @NickDuddy literal_eval() 将值处理为 Python 文字,而不是 JSON。这更能容忍一些语法问题,比如使用单引号而不是双引号。
  • @NickDuddy ast.literal_eval 是内置函数eval 的一种更安全的形式。 ast.literal_eval 强制您传递的字符串被解释,从而让您的 python 代码运行代码。
  • 好的。我以前从未见过这个,所以我会试一试并反馈。听起来不错。
  • 什么?说 ast.literal_eval 运行代码是相当误导:它只能解析代表有效 Python 文字的字符串。
【解决方案2】:

基于我使用的 TomSitter 的修正建议

ksdata.cat_slug_raw.str.split('/').str[0]

这是绕过它的最简单方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多