与R中的str_locate正则表达式完全匹配

时间:2013-11-08 23:09:31

标签: regex r stringr

我试图尝试对某人在美国参议院运行if()条件......但我得到了错误的结果,因为我无法完全匹配R.我尝试了字界限\ b和开始/结束^ $,但它似乎不起作用....而且不知道为什么?

> splits[[1]][4]
[1] "Ohio State Senate, 1979-1983"
> is.numeric(str_locate(splits[[1]][4], "\bSenator\b"))
[1] TRUE
> is.numeric(str_locate(splits[[1]][4], "/^Senator$/"))
[1] TRUE
> pattern <- "\bSenator\b"
> is.numeric(str_locate(splits[[1]][4], pattern))
[1] TRUE

基本上,上述情况都应该是假的,因为我的数据只使用参议员,如果是美国参议院,而不是州参议员。

非常感谢您的帮助!

谢谢你, 沃尔特

3 个答案:

答案 0 :(得分:1)

该功能按预期工作,您只对返回类型感到惊讶。如果找不到匹配项,则返回NA。更具体地说,返回NA_integer_(取整数-2147483648的最大负值)。

x <- "Ohio State Senate, 1979-1983"
str_locate( x , "\bSenator\b")
#     start end
#[1,]    NA  NA
#[2,]    NA  NA

NA_integer_实际上是数字......

is.numeric( NA_integer_ )
#[1] TRUE

所以一切正常。请改为!all( is.na( str_locate( x , "\bSenator\b") ) )

答案 1 :(得分:0)

x<-"Ohio State Senate, 1979-1983"
kk<-unlist(strsplit(x," "))
kk %in% state.name
[1]  TRUE FALSE FALSE FALSE

OR,

is.numeric(str_locate(x, state.name)) #If this is true, then the senator is state senator

答案 2 :(得分:0)

str_locate的帮助文档指定它返回一个整数矩阵。在非匹配时使用该函数,它会返回NA

您可以针对NA进行测试:

> library(stringr)
> v <- "Ohio State Senate, 1979-1983"

> str_locate(v, "\\bSenator\\b")
start end
[1,]    NA  NA
> is.na(str_locate(v, "\\bSenator\\b")[,c('start')])
start
TRUE

> str_locate(v, "Senate")
start end
[1,]    12  17
> is.na(str_locate(v, "Senate")[,c('start')])
start
FALSE

就个人而言,我只是使用grep:

> grep("Senate",v)
integer(1)
> grep("Senator",v)
integer(0)

如果你想使用单词边界匹配,你需要逃避斜杠:\\b,而不是\b