R正则表达式取代&向量

时间:2017-11-21 18:29:10

标签: r regex stringr

如何str_replace以“{1}}开头”和“向量”?

我试图从名单列表中删除前缀(Mr.,Ms.,Dr.,Capt。等),仅从头开始。我试过了:^。这仅取代了名称向量中的少数前缀(Mr.,Ms.,Dr.,Capt。等),但大多数前缀仍然存在。同时我不想将str_replace(name, prefix, '')中的Dr替换为Dr. Drakeake应为Dr. Drake

Drake

有空格。不过,我们可以移除name <- c('Mrs. Emily S', 'Dr. Richard L', 'Dr. Drake D', 'Mr. Mrdrmsmrs', 'Test Name') prefix <- c('Dr.', 'Mr.', 'Ms.', 'Mrs.', 'Capt.') # Wiktor Stribiżew's code str_replace(name, paste0("^(?:", paste(prefix, collapse="|"), ")(?!\\.)"), '') trimws()

的内容

1 个答案:

答案 0 :(得分:1)

只有当prefix字符向量出现在字符串的开头时,才想删除它们中定义的字母数字字符串。它们包含文字.,必须对其进行转义以表示模式中的文字.

使用

regex.escape <- function(string) {
  gsub("([][{}()+*^${|\\\\?])", "\\\\\\1", string)
}
sort.by.length.desc <- function (v) v[order( -nchar(v)) ]  ## Just in case you have overlapping items in prefix char vector

name <- c('Mrs. Emily S', 'Dr. Richard L', 'Dr. Drake D', 'Mr. Mrdrmsmrs', 'Test Name')
prefix <- c('Dr.', 'Mr.', 'Ms.', 'Mrs.', 'Capt.')
prefix <- sort.by.length.desc(prefix) ## This is not important unless any abbreviation ends with more than 1 dot, else you may remove this line for the current problem
res <- trimws(gsub(paste0("^(?:",paste(regex.escape(prefix), collapse="|"), ")"), '', name, perl="TRUE"))
res
## => [1] "Emily S"   "Richard L" "Drake D"   "Mrdrmsmrs" "Test Name"
## OR
## res <- trimws(str_replace(name, paste0("^(?:",paste(regex.escape(prefix), collapse="|"), ")"), ''))

请参阅online R demo

在这里,paste0("^(?:",paste(regex.escape(prefix), collapse="|"), ")")动态创建类似^(?:Mr\.|Ms\.|Dr\.|Capt\.)的模式,匹配如下字符串:

  • ^ - 字符串开头
  • (?:Mr\.|Ms\.|Dr\.|Capt\.) - Mr.Ms.Dr.Capt.等。