正则表达式检测R中的代码

时间:2018-11-05 23:40:50

标签: r regex string

我有一组要在数据框中检查的代码,如果它们存在,我想创建一列以指示TRUEFALSE

  • 以OO,MM,AB,HIB,POL开头的字符串
  • 后面最多5或9位数字

因此,我在数据资料库中拥有一些代码:OO14562,MM156789076,AB1234674,HIB00000,POL112310

数据帧在这里:

df<-structure(list(Codes = structure(c(5L, 4L, 1L, 3L, 7L, 8L, 2L, 
6L), .Label = c("AB1234674", "AB13", "HIB00000", "MM156789076", 
"OO14562", "POL1123", "POL112310", "TY543"), class = "factor")), .Names = "Codes", row.names = c(NA, 
-8L), class = "data.frame")

根据数据框,前5个应返回TRUE,后三个应为FALSE。

我的代码在这里

gsub([OO|MM|AB|HIB|POL[0-9]{5-9})

但这并不能带我去任何地方。

1 个答案:

答案 0 :(得分:3)

一个,我们需要使用括号而不是括号来分隔字母集。括号中的“匹配项之一”与管道配对时将无法预测。 [aa|bb|cc]实际上将与abc或文字|相匹配,这不是您想要的行为。

二,我们将使用grepl,因为它返回逻辑向量,无需使用gsub

三,要匹配的数量在花括号{ }中指定,但最小值和最大值由逗号而不是破折号分隔。

您也可以使用[0-9]代替\\d(任何数字),但为简洁起见,我喜欢\\d

为了完整起见,我添加了^$来匹配模式后字符串的开头和结尾。

这给我们:

df$check <- grepl("^(OO|MM|AB|HIB|POL)\\d{5,9}$", df$Codes)


        Codes check
1     OO14562  TRUE
2 MM156789076  TRUE
3   AB1234674  TRUE
4    HIB00000  TRUE
5   POL112310  TRUE
6       TY543 FALSE
7        AB13 FALSE
8     POL1123 FALSE