【问题标题】:escaped characters ignored in regex character class正则表达式字符类中忽略的转义字符
【发布时间】:2014-12-17 21:28:37
【问题描述】:

一位同事给了我一个分隔文件。一列包含类似 JSON 的键/值对。我想将它们解析成列表。不幸的是,同事的 JSON 表示法似乎与 rjson 的期望不符。

jsonString <- "{person:[Santa],location:[NorthPole]}"
fromJSON(jsonString)
Error in fromJSON(jsonString) : 
  unexpected character "p"; expecting opening string quote (") for key value

所以我决定做一些正则表达式清理,将方括号转换为引号。我可以将 '[' 替换为 '"',但在同一操作中替换 '[' 和 ']' 时遇到问题:

gsub(pattern = "\\[", replacement = '"', x = jsonString)
[1] "{person:\"Santa],location:\"NorthPole]}"

字符类是可能的:

gsub(pattern = "[aeiou]", replacement = '"', x = jsonString)
[1] "{p\"rs\"n:[S\"nt\"],l\"c\"t\"\"n:[N\"rthP\"l\"]}"

但在这种情况下,没有检测到括号:

gsub(pattern = "[\\[\\]]", replacement = '"', x = jsonString)
[1] "{person:[Santa],location:[NorthPole]}"

我也愿意接受其他非正则表达式解决方案,用于将类似 JSON 的字符串解析为 R 数据对象。

【问题讨论】:

  • 试试:gsub(pattern = "\\[|]", replacement = '"', x = jsonString)
  • 您使用的是哪个fromJSON?至少有三个包包含同名的函数
  • @nicola 好主意。这行得通,但是对于在类中包含两个以上的字符,我想我更喜欢使用 [] 表示法。
  • @RichardScriven: rjson
  • @MarkMiller 然后使用gsub(pattern = "[]\\[]", replacement = '"', x = jsonString)

标签: regex json r


【解决方案1】:

我不知道这是否足够笼统,但它适用于您的简单案例:

> require(RJSONIO)
Loading required package: RJSONIO
> qjson <- gsub(patt="(\\w+)", repl='"\\1"', gsub("[][]", "", jsonString) )
> fromJSON(qjson)
     person    location 
    "Santa" "NorthPole" 

取出所有“[”和“]”并在所有“单词”周围加上双引号。 “[”和“]”字符的字符类处理对字符串中的位置敏感。要匹配文字-“]”,它必须是第一个,而要匹配文字-“[”,它必须是除第一个之外的任何地方。请参阅?regex 部分关于字符类。

【讨论】:

  • 这就是我现在真正需要的。我会留意泛化问题。
  • 正如预期的那样:值中的空格打破了这个原本很好的建议... jsonString
  • 如果您希望空格不中断,您可以将 patt 参数替换为...... "[[:alpha:] ]+" 甚至 "[[:alnum:] ]+""[[:alnum:] -_]+"
  • 使用 [[:alnum:] ]+,我能够解析我的 750k 生物医学术语对。我认为我现在可以根据需要修改这种方法。
【解决方案2】:

我无法确切说明原因,但设置 perl=TRUE 似乎可以解决

gsub(pattern = "[\\[\\]]", replacement = '"', x = jsonString, perl=TRUE)
# [1] "{person:\"Santa\",location:\"NorthPole\"}"

基本解释器解析字符类的方式必须有所不同。

您也可以尝试使用正则表达式直接提取数据。这里我使用了regcapturedmatches 辅助函数。

m<-gregexpr("(\\w+):\\[([^]]*)\\]", jsonString, perl=T)
regcapturedmatches(jsonString , m)

# [[1]]
#      [,1]       [,2]       
# [1,] "person"   "Santa"    
# [2,] "location" "NorthPole"

【讨论】:

  • 我也这样做了,但它仍然无法解析 fromJSON,但我想这不是真正的问题
  • 对,“真实”的 JSON 文件也有关于元素名称的引号。 (即"person": "Santa"
  • 有人想建议一种将我同事的符号转换为真实 JSON 的方法吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-05-14
  • 2012-09-09
  • 2017-04-13
  • 2014-03-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多