【问题标题】:Return number from string从字符串返回数字
【发布时间】:2016-12-13 08:11:50
【问题描述】:

我正在尝试在下面的字符串中提取“人类”的“数字”,例如:

string <- c("ProjectObjectives|Objectives_NA, PublishDate|PublishDate_NA, DeploymentID|DeploymentID_NA, Species|Human|Gender|Female, Species|Cat|Number|1, Species|Human|Number|1, Species|Human|Position|Left")

文本在字符串中的位置会不断变化,所以需要用R搜索字符串,找到“Species|Human|Number|”并返回 1。

抱歉,如果这是另一个线程的副本,但我已经看过这里 (extract a substring in R according to a pattern) 和这里 (R extract part of string)。但我运气不好。

有什么想法吗?

【问题讨论】:

    标签: r regex


    【解决方案1】:

    使用捕获方法 - 在已知子字符串之后捕获 1 个或多个数字 (\d+)(只需转义 | 符号):

    > string <- c("ProjectObjectives|Objectives_NA, PublishDate|PublishDate_NA, DeploymentID|DeploymentID_NA, Species|Human|Gender|Female, Species|Cat|Number|1, Species|Human|Number|1, Species|Human|Position|Left")
    > pattern = "Species\\|Human\\|Number\\|(\\d+)"
    > unlist(regmatches(string,regexec(pattern,string)))[2]
    [1] "1"
    

    一种变体是使用带有regmatches/regexpr 的 PCRE 正则表达式

    > pattern="(?<=Species\\|Human\\|Number\\|)\\d+"
    > regmatches(string,regexpr(pattern,string, perl=TRUE))
    [1] "1"
    

    这里,左侧上下文被放置在一个非消费模式中,一个积极的后视,(?&lt;=...)

    使用\K 运算符可以实现相同的功能:

    > pattern="Species\\|Human\\|Number\\|\\K\\d+"
    > regmatches(string,regexpr(pattern,string, perl=TRUE))
    [1] "1"
    

    【讨论】:

      【解决方案2】:

      我能想到的最简单的方法:

      as.integer(gsub("^.+Species\\|Human\\|Number\\|(\\d+).+$", "\\1", string))
      

      它将在没有提及 Speces|Human|Number 的地方引入 NA。此外,如果任何字符串是数字,就会出现伪像(但我认为这不会成为问题)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-08
        • 2010-12-14
        • 2014-12-07
        • 2014-11-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多