我正在尝试识别在R中某个子字符串之后出现的数字。
例如:
sa <- "100 dollars 200"
在上面的字符串中,为了找到单词dollar
后面出现的数字,我执行以下代码:
str_match_all(sa,"(?<=dollars )\\d+")
我得到以下结果:
[[1]]
[,1]
[1,] "200"
但是,当我使用以下输入时:
sa <- "100 dollars for 200 pesos"
我非常失败地将输出设为200
。
答案 0 :(得分:1)
您可以捕获 0或更多非数字后的数字。在此方面The
str_match function differs from the
str_extract`,它会保留所有捕获组值。
> sa<-"100 dollars for 200 pesos"
> str_match_all(sa,"dollars\\D*(\\d+)")
[[1]]
[,1] [,2]
[1,] "dollars for 200" "200"
只需使用第二列中的值。
模式详情
dollars
- 匹配dollars
子字符串\\D*
- 除数字以外的零个或多个字符(它也匹配空格)(\\d+)
- 第1组:一个或多个数字。要仅提取200
值,您可以使用regmatches/regexpr
:
sa<-c("100 dollars for 200 pesos", "100 dollars 200 pesos")
regmatches(sa, regexpr("dollars\\D*\\K\\d+", sa, perl=TRUE))
## => [1] "200" "200"
请参阅R demo。
<强>详情
dollars
- 子字符串\\D*
- 数字以外的任何0 +字符\\K
- 匹配重置运算符\\d+
- 一位或多位数。 .*
作为前缀/后缀的相同模式可以与sub
一起使用(不需要gsub
,因为我们只需要一次搜索和替换操作:
sa<-c("100 dollars for 200 pesos", "100 dollars 200 pesos")
sub(".*dollars\\D*(\\d+).*", "\\1", sa)
## => [1] "200" "200"
答案 1 :(得分:0)
另一种方法是简单地使用gsub()
来获取您想要的数字。更具体地说,您可以定义一个模式,用于搜索“&#39;美元”之后的第一个数字。
# define the pattern
pat <- "^.*dollars.*?([0-9]+).*"
# example 1
str <- "100 dollars for 200 pesos"
gsub(pat, "\\1", str)
[1] "200"
# example 2
str <- " 100, actually 100.12 dollars for 200 pesos or 1000 dimes"
gsub(pat, "\\1", str)
[1] "200"
为了更好地解释模式:
^ >> from the beginning of the string...
.* >> every character till...
dollars >> the substring 'dollars'...
.*? >> and than any character until the first...
([0-9]+) >> number of any length, that is selected as group...
.* >> and then everything else
当匹配此模式时,gsub()
会将其替换为选为组的数字,这意味着在&#39; dollar&#39;之后的第一个数字。