R正则表达式在字符串中查找范围

时间:2014-10-30 14:40:27

标签: regex r

我有一堆电子邮件主题行,我正在尝试提取是否存在一系列值。这就是我试图这样做的方法,但我没有得到我想要的结果:

library(stringi)

df1 <- data.frame(id = 1:5, string1 = NA)
df1$string1 <- c('15% off','25% off','35% off','45% off','55% off')

df1$pctOff10_20 <- stri_match_all_regex(df1$string1, '[10-20]%')


  id string1 pctOff10_20
1  1 15% off          NA
2  2 25% off          NA
3  3 35% off          NA
4  4 45% off          NA
5  5 55% off          NA

我想要这样的事情:

 id string1 pctOff10_20
1  1 15% off          1
2  2 25% off          0
3  3 35% off          0
4  4 45% off          0
5  5 55% off          0

2 个答案:

答案 0 :(得分:3)

这是要走的路,

df1$pctOff10_20 <- stri_count_regex(df1$string1, '^(1\\d|20)%')

<强>解释

^                        the beginning of the string
(                        group and capture to \1:
  1                        '1'
  \d                       digits (0-9)
 |                        OR
  20                       '20'
)                        end of \1
%                        '%'

答案 1 :(得分:1)

gsubfn中的

1) strapply可以通过组合正则表达式(pattern=参数)和函数(FUN=参数)来实现。下面我们使用函数的公式表示。或者,我们可以使用data.table(或许多其他包)中的betweeen。这会将匹配提取到模式,将函数应用于它并返回结果,将其简化为向量(而不是列表):

library(gsubfn)

btwn <- function(x, a, b) as.numeric(a <= as.numeric(x) & as.numeric(x) <= b)

transform(df1, pctOff10_20 = 
   strapply(
      X = string1, 
      pattern = "\\d+", 
      FUN = ~ btwn(x, 10, 20),
      simplify = TRUE
   )
)

2)使用上面定义的相同btwn函数的基础解决方案是:

transform(df1, pctOff10_20 = btwn(gsub("\\D", "", string1), 10, 20))