R正则表达式替换和向量
R regex replace & vector
str_replace
如何使用 "starting with" ^
和矢量?
我正在尝试从名称列表中删除前缀(先生、女士、博士、上尉等),只是从头开始。我试过:str_replace(name, prefix, '')
。这仅替换了名称向量中的少数前缀(Mr.、Ms.、Dr.、Capt. 等),但大多数前缀仍然存在。同时我不想将 Dr. Drake
中的 Dr 替换为 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()
或 stringr::str_trim()
您只想删除 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="|"), ")"), ''))
在这里,paste0("^(?:",paste(regex.escape(prefix), collapse="|"), ")")
动态创建了一个类似于 ^(?:Mr\.|Ms\.|Dr\.|Capt\.)
的模式来匹配这样的字符串:
^
- 字符串开头
(?:Mr\.|Ms\.|Dr\.|Capt\.)
- Mr.
、Ms.
、Dr.
、Capt.
等
str_replace
如何使用 "starting with" ^
和矢量?
我正在尝试从名称列表中删除前缀(先生、女士、博士、上尉等),只是从头开始。我试过:str_replace(name, prefix, '')
。这仅替换了名称向量中的少数前缀(Mr.、Ms.、Dr.、Capt. 等),但大多数前缀仍然存在。同时我不想将 Dr. Drake
中的 Dr 替换为 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()
或 stringr::str_trim()
您只想删除 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="|"), ")"), ''))
在这里,paste0("^(?:",paste(regex.escape(prefix), collapse="|"), ")")
动态创建了一个类似于 ^(?:Mr\.|Ms\.|Dr\.|Capt\.)
的模式来匹配这样的字符串:
^
- 字符串开头(?:Mr\.|Ms\.|Dr\.|Capt\.)
-Mr.
、Ms.
、Dr.
、Capt.
等