从字符串返回数字

时间:2016-12-13 08:11:51

标签: r regex

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

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)。但我没有运气。

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

使用捕获方法 - 在已知子字符串后捕获一个或多个数字(\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"

在这里,左侧上下文放在一个非消费模式中,一个正面的后视,(?<=...)

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

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

答案 1 :(得分:1)

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

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

它将引入没有提及Speces | Human | Number的NAs。此外,如果任何字符串是一个数字(但我认为这不会成为一个问题),将会有人工制品