我有以下矢量:
a <- c("SOCORRO SANTANDER", "SANTANDER DE QUILICHAO",
"LOS PATIOS NORTE DE SANTANDER", "LOS PATIOS NTE DE S DER")
并且当字符串末尾仅时,需要删除所有出现的“SANTANDER”或其缩写(以及NORTE或其缩写,如果存在)。
到目前为止,我已经尝试过(在评论中为什么会失败):
gsub("(.*)( N.*DER$)", "\\1", a) # Fails at SOCORRO
gsub("(.*)( N.*DER$| DER$)", "\\1", a) # Only removes DER at LOS PATIOS
gsub("(.*)([ N.*DER$]|[ DER$])", "\\1", a) # Removes trailing R (??)
gsub("(.*)( N?.*DER$)", "\\1", a) # Fails removing " NTE DE S" and "NORTE DE"
所以,特别是,我想知道如何充分删除字符串中不需要的部分,但更一般我想知道创建正则表达式的正确方法来测试这种情况(我的第一次写作是“在组内使用OR(|
)”,我认真期待尝试2或3的工作。)
预期结果是:
a
## [1] "SOCORRO" "SANTANDER DE QUILICHAO" "LOS PATIOS" "LOS PATIOS"
答案 0 :(得分:2)
sub('(\\s*\\b(NORTE\\s+DE|NTE\\s+DE))?\\s*\\b(SANTANDER|S\\s+DER)$','',a);
## [1] "SOCORRO" "SANTANDER DE QUILICHAO" "LOS PATIOS" "LOS PATIOS"
gsub()
,因为我们不需要在同一个字符串中多次匹配。答案 1 :(得分:1)
我们可以尝试
sub("(.*)(\\s+N.*(DER)$)|\\s+SANTANDER$", "\\1", a)
#[1] "SOCORRO" "SANTANDER DE QUILICHAO" "LOS PATIOS"
#[4] "LOS PATIOS"
或者
sub("\\s+(N(\\S+\\s+){1,}|)\\S*DER$", "", a)
#[1] "SOCORRO" "SANTANDER DE QUILICHAO" "LOS PATIOS"
#[4] "LOS PATIOS"