从 JSON 格式检索数据的正则表达式模式需要太多时间,因为不够具体

Regex pattern to retrieve data from a JSON format, takes too much time because is not specific enough

我在尝试从 JSON 结构中检索数据时遇到问题。我可以看到一种模式,但我没有看到一种既通用又高效的清晰方法。

我使用的数据是来自 Kaggle 挑战的 TMDB 票房预测对应的数据,在它拥有的许多列中,其中一些以 JSON-ish 的方式格式化。因为我看不到您可以从中提取的大部分数据的任何价值,所以我实际上只想获得每个 JSON 的名称列表或名称,因为每个 JSON 列都有一个名为 "name".

的属性

我举几个例子,让大家明白我的意思:

[{'id': 34055, 'name': 'Pokémon Collection', 'poster_path': '/j5te0YNZAMXDBnsqTUDKIBEt8iu.jpg', 'backdrop_path': '/iGoYKA0TFfgSoZpG2u5viTJMGfK.jpg'}]
[{'id': 12, 'name': 'Adventure'}, {'id': 16, 'name': 'Animation'}, {'id': 10751, 'name': 'Family'}, {'id': 14, 'name': 'Fantasy'}]
[{'name': 'Woolner Brothers Pictures Inc.', 'id': 9233}]

我希望尽可能通用的代码如下所示,它选择了我感兴趣的列并期望检索名称并给出可以找到的名称列表。

#trainSet is the data from the train.csv from the challenge
trainingNames <- as.data.frame(names(trainSet))
trainingNames1 <- trainingNames[c(2,4,12,13,16,20),]        
for (column in trainingNames1){
  for (i in 1:length(trainSet[[column]])) {
    keywords <- str_extract_all(toString(trainSet[[column]][[i]]), "'name': '(\s*\w+)+'")[[1]]
    keywords <- gsub("'", "", keywords)
    trainSet[[column]][i]  <- list(gsub("'name':", "", keywords))
    #print(trainSet[[column]][i] )
  }
}

这个正则表达式如果我在特定情况下测试,它可以工作,但因为它有通配符 + 我知道它在 JSON 上迭代太多,主要是做太多的组合.在这个正则表达式之前,我有另一个正则表达式,但主要问题是它没有考虑 "phrases" 的情况,所以任何超过一个词的东西都不会读它。 (例如名称:指环王)

我见过一个人做了以下事情,但它对我来说太具体了,我想节省时间而不是以编程方式提供数据提供的模式,所以即使这是一个很好的解决方案,我不喜欢它,因为它附加到特定的列:

train$collection_name <- str_extract(train$belongs_to_collection, "(?<=name\'\:\s{1}\').+(?=\'\,\s{1}\'poster)")

所以我想知道的是,是否有可能以我正在考虑的类似方式进行,但考虑到例如必须以“'结尾" 或不是下一个 JSON 元素的另一个模式。

也许我也以错误的方式接近它,所以我感谢您提供给我的任何一种 comment/orientation。

谢谢!

如果需要群,那么:

'name': '(\s*[^\s']*)*'

其他

'name': '([^']*)'

第一个正则表达式会更快,因为它匹配 space 直到下一个非 space 和非引号。如果您不需要按照原来的方式进行分组,则可以使用第二个正则表达式。这匹配从第一个引号到下一个引号,匹配所有非引号。