【问题标题】:Regular expression in R. Capture specific fieldR中的正则表达式。捕获特定字段
【发布时间】:2015-03-19 22:08:40
【问题描述】:

我在 R 中有以下向量:

x <- c("id: capture this , something: the useless chunk , otherstuff: useless , more stuff")

我想得到字符串“capture this”。 我用过这个正则表达式:

library(rex)
r <- rex(
  start,
  anything,
  "id: ",
  capture(anything),
  " , ", 
  anything
)
r
# > r
# > ^.*id: (.*) , .*
re_matches(x,r)

但我得到的是:

> re_matches(x,r)
                                                                  1
1 capture this , something: the useless chunk , otherstuff: useless

它捕获了我想要的内容,也捕获了字符串的其余部分。我只想要“捕获这个”字段。 即使我使用 gsub 功能:

gsub("^.*id: (.*) , .*", "\\1", x)

使用相同的正则表达式我得到了相同的结果。

这是R的信息: R 版本 3.1.3 (2015-03-09) -- “Smooth Sidewalk” 版权所有 (C) 2015 统计计算 R 基金会 平台:x86_64-pc-linux-gnu (64-bit)

还有 ubuntu 的版本: 没有可用的 LSB 模块。 经销商编号:Ubuntu 说明:Ubuntu 14.04.2 LTS 发布:14.04 代号:信任

【问题讨论】:

  • 您的“R 中的向量”,命名为:r 是单个字符串。 “rex”和“re_matches”函数从何而来?
  • 它们来自“rex”包。我使用 rex 函数来构建 "^.*id: (.*) , .* " 表达式和 re_matches 以获得结果。如果我使用,我得到了相同的结果: gsub("^.*id: (.*) , .*", "\\1", x)
  • 请提供完整的自包含代码示例。缺少library 调用。
  • 您可能会发现充分学习正则表达式以避免需要“rex”包提供的帮助很有用。对我(和其他人,我怀疑)这是程序员和问题之间的一个障碍。
  • 谢谢你的建议,你是对的。我目前正在使用这个包,因为我想构建更大的正则表达式并使它们对其他人可读。谢谢!

标签: regex r


【解决方案1】:

你在使用 yaml 吗?如果是这样,您可能会发现 yaml 包很有用

x <- c("id: capture this , something: the useless chunk , otherstuff: useless , more: stuff")

yaml::yaml.load(gsub(' , ', '\n', x))$id
# [1] "capture this"

请注意,我必须添加一个冒号才能使上述内容生效,但此解决方案的好处是您可以根据关键字段提取每个部分。

下一个使用您的示例字符串并且不使用包:

x <- c("id: capture this , something: the useless chunk , otherstuff: useless , more stuff")

gsub('id: (.*?) ,.*', '\\1', x)
# [1] "capture this"

【讨论】:

    【解决方案2】:

    您不一定需要使用包来获取您所追求的子字符串。使用gsub 的下一个错误是您的正则表达式,* 是一个greedy 运算符,这意味着它将尽可能匹配并且仍然允许正则表达式的其余部分继续匹配。

    *? 用于非贪婪匹配,意思是“零个或多个 - 最好尽可能少”。

    gsub("^.*id: (.*?) , .*", "\\1", x)
                    ^
    

    如果字符串以“id”开头,您可以移除锚点和初始.* 令牌。

    sub('id: (.*?) ,.*', '\\1', x)
    # [1] "capture this"
    

    注意:我在这里使用了sub,因为你只有一次出现。

    【讨论】:

    • 谢谢!我遇到了这个问题,我不知道如何停止匹配下一个类似模式的 * 运算符。并感谢您明确 gsub 和 sub 的使用。
    【解决方案3】:
        # using the rex package
        library(rex)
        x <- c("id: capture this , something: the useless chunk , otherstuff: useless , more stuff")
        r <- rex(start,"id: ",capture(non_puncts))
        re_matches(x,r)
        #1 capture this
    

    【讨论】:

    • 我不知道“no_puncts”快捷方式以及如何使用它。谢谢!
    • non_puncts 位于 rex 文档的“快捷方式”部分。请注意,我们通过识别逗号之前的所有内容来选择尾随空格。
    【解决方案4】:

    这是一种使用我管理的 qdapRegex 库的简单可推广方法,可用于在左右边界之间抓取“东西”:

    x <- c("id: capture this , something: the useless chunk , otherstuff: useless , more stuff")
    
    library(qdapRegex)
    rm_between(x, "id: ", " ,", extract=TRUE)
    
    ## [[1]]
    ## [1] "capture this"
    

    【讨论】:

      猜你喜欢
      • 2019-10-08
      • 1970-01-01
      • 2023-01-17
      • 2023-01-10
      • 2017-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多