【问题标题】:Match a substring with character, digits and spaces with gsub使用 gsub 匹配带有字符、数字和空格的子字符串
【发布时间】:2018-08-23 09:08:17
【问题描述】:

我有一个类似的字符串:

a <- '{:name=>"krill", :priority=>2, :count=>1}, {:name=>"vit a", :priority=>2]}, {:name=>"vit-b", :priority=>2, :count=>1}, {:name=>"vit q10", :priority=>2]}'

我想通过 str_match 解析 ':name=>" ' 和 ' " ' 中的元素

krill
vit a
vit-b
vit q10

到目前为止我尝试过:

str_match(a, ':name=>\\"([A-Za-z]{3})')

但它不起作用。

感谢任何帮助

【问题讨论】:

  • 你的字符串是a &lt;- '{:name=&gt;"krill", :priority=&gt;2, :count=&gt;1}, {:name=&gt;"vit a", :priority=&gt;2]}, {:name=&gt;"vit-b", :priority=&gt;2, :count=&gt;1}, {:name=&gt;"vit q10", :priority=&gt;2]}'吗?
  • 你的实际字符串是什么?它是某种形式的 JSON 吗?我的猜测是你不应该使用正则表达式来解析它。
  • 不幸的是,它不是 json,字段可能会有所不同并且它是非结构化的。 @蒂姆
  • 编辑了字符串。 @WiktorStribiżew

标签: r regex gsub


【解决方案1】:

您可以使用

提取这些值
> regmatches(a, gregexpr(':name=>"\\K[^"]+', a, perl=TRUE))
[[1]]
[1] "krill"   "vit a"   "vit-b"   "vit q10"

:name=&gt;"\\K[^"]+ pattern 匹配

  • :name=&gt;" - 文字子串
  • \K - 从匹配项中省略子字符串
  • [^"]+ - 除了" 之外的一个或多个字符。

如果需要使用stringr包,请使用str_extract_all

> library(stringr)
> str_extract_all(a, '(?<=:name=>")[^"]+')
[[1]]
[1] "krill"   "vit a"   "vit-b"   "vit q10"

(?&lt;=:name=&gt;")[^"]+ 中,(?&lt;=:name=&gt;") 匹配紧接在:name=&gt;" 前面的任何位置。

【讨论】:

  • 所以\K 会在比赛中忽略它之前的所有内容?
  • @snoram 是的,\K 是一个清除当前匹配缓冲区的match reset operator。\
【解决方案2】:

使用stringr正向观察

library(stringr)
str_match_all(a, '(?<=:name=>")[^"]+')

[[1]]
     [,1]     
[1,] "krill"  
[2,] "vit a"  
[3,] "vit-b"  
[4,] "vit q10"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-09-03
    • 2013-11-19
    • 1970-01-01
    • 2019-09-12
    • 2014-08-30
    • 2018-01-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多