R gsub仅在字符串末尾删除单词变体

时间:2016-04-16 10:09:37

标签: regex r gsub

我有以下矢量:

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"

2 个答案:

答案 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"