2

我正在尝试识别出现在 R 中某个子字符串之后的数字。

例如:

sa <- "100 dollars 200"

在上面的字符串中,要找到出现在 word 之后的数字dollar,我执行以下代码:

str_match_all(sa,"(?<=dollars )\\d+") 

我得到以下结果:

  [[1]]
     [,1] 
[1,] "200"

但是,当我使用以下输入时:

sa <- "100 dollars for 200 pesos"

我非常失败,无法将输出作为200.

4

2 回答 2

4

另一种方法是简单地使用gsub()来获取您想要的数字。更具体地说,您可以定义一个模式来搜索单词“dollars”之后的第一个数字。

# 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()将其替换为选择作为组的数字,即“美元”之后的第一个数字。

于 2017-09-20T11:09:59.180 回答
1

您可以捕获0 个或多个非数字之后的数字。Thestr_match function differs from thestr_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 演示

细节

  • dollars- 一个子串
  • \\D*- 除数字外的任何 0+ 个字符
  • \\K- 匹配重置运算符
  • \\d+- 1 个或多个数字。

.*可以使用带有 as 前缀/后缀的相同模式sub(不需要 a,gsub因为我们只需要一个搜索和替换操作:

sa<-c("100 dollars for 200 pesos", "100 dollars 200 pesos")
sub(".*dollars\\D*(\\d+).*", "\\1", sa)
## => [1] "200" "200"

再看一个演示

于 2017-09-20T10:47:27.813 回答