R中的Grep匹配得到非数字

时间:2015-05-30 16:45:42

标签: regex r

我需要获得角色的非数字部分。我在R中的这个正则表达式有问题(根据regexpal应该有效):

grep("[\\D]+", "PC 17610", value = TRUE, perl = F)

返回"PC "

时应返回character(0)

其他测试用例:

grep("[\\D]+", "STON/O2. 3101282    ", value = TRUE, perl = F)
# should return "STON/O2."
grep("[\\D]+", "S.C./A.4. 23567", value = TRUE, perl = F)
# should return "S.C./A.4."
grep("[\\D]+", "C.A. 31026", value = TRUE, perl = F)
# should return "C.A."

更新

工作是将列"Ticket"(来自泰坦尼克号灾难数据库)划分为"TicketNumber""TicketSeries"列。至于现在,Ticket低于例如值:"A/5 21171", "PC 17599", "STON/O2. 3101282", "113803"。因此,故障单编号列用于第一个记录21171和故障单系列列"A/5",依此类推,用于下一个记录。

对于记录"113803",TicketNumber应为"113803"和TicketSeries NA

帮助表示感谢, 谢谢!

2 个答案:

答案 0 :(得分:3)

使用sub代替,使用\S正则表达式令牌匹配任何非空白字符。

x <- c('PC 17610', 'STON/O2. 3101282    ', 'S.C./A.4. 23567', 'C.A. 31026')
sub('(\\S+).*', '\\1', x)
# [1] "PC"        "STON/O2."  "S.C./A.4." "C.A."

修改

否则,如果你想为无效或空匹配返回NA,我想你可以......

x <- c('PC 17610', 'STON/O2. 3101282    ', 'S.C./A.4. 23567', 'C.A. 31026', '31026')
r <- regmatches(x, gregexpr('^\\S+(?=\\s+)', x, perl=T))
unlist({r[sapply(r, length)==0] <- NA; r})
# [1] "PC"        "STON/O2."  "S.C./A.4." "C.A."      NA 

答案 1 :(得分:1)

您可以使用str_extract

library(stringr)
str_extract(x, '\\S+(?=\\s+)')
#[1] "PC"        "STON/O2."  "S.C./A.4." "C.A."      NA       

数据

x <- c('PC 17610', 'STON/O2. 3101282    ', 'S.C./A.4. 23567', 
        'C.A. 31026', '31026')