我正在尝试在下面的字符串中提取“人类”的“数字”,例如:
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)。但我没有运气。
有什么想法吗?
答案 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
> 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。此外,如果任何字符串是一个数字(但我认为这不会成为一个问题),将会有人工制品