如何str_replace
以“{1}}开头”和“向量”?
我试图从名单列表中删除前缀(Mr.,Ms.,Dr.,Capt。等),仅从头开始。我试过了:^
。这仅取代了名称向量中的少数前缀(Mr.,Ms.,Dr.,Capt。等),但大多数前缀仍然存在。同时我不想将str_replace(name, prefix, '')
中的Dr替换为Dr. Drake
。 ake
应为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()
答案 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.
等。