R-从JSON格式检索数据的REGEX模式需要太多时间,因为不够具体



我尝试从JSON结构检索数据时有问题。我可以看到一种模式,但我看不出一种清晰的方法,同时又一般且高效。

我正在使用的数据是与Kaggle挑战的TMDB票房预测相对应的数据,其中有些是以JSON-ish方式形成的。因为我在大多数数据上都看不到任何值的值,所以我实际上只想获得此JSON中每个JSON的名称或名称的列表,因为每个JSON列都有一个名为"名称"的属性。

我举了一些例子,以便我们都可以看到我的意思:

[{'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上太迭代了,并且主要是在做太多组合。在这条正则态度之前,我有另一个正则是正则是,但主要的问题是,它没有考虑使用"短语"的案例,所以任何一个不止一个词的东西都不会阅读。(例如名称:指环王(

我已经看过一个做以下操作的人,但是我太具体了,我想节省时间,不要在编程中提供数据提供的模式,因此即使是一个很好的解决方案,我也不是喜欢它,因为它附着在特定列上:

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

所以我想知道的是,如果可以以类似的方式进行我的思考,但考虑到例如,必须以" '"或其他模式结束不是下一个JSON元素。

也许我也以错误的方式处理它,因此我感谢您为我提供的任何评论/方向。

谢谢!

如果需要组,则:

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

其他

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

第一个正则态度将更快,因为它与下一个非空间和非报价匹配的空间匹配。如果您不需要以其方式进行分组,则可以使用第二个正则表达式。从第一个报价到下一个报价,这匹配了所有非引号。

最新更新