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

R gsub remove word variation ONLY at end of string

我有以下向量:

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"

所以,特别是,我想知道如何充分删除字符串中不需要的部分,但更一般地说我想知道正确的方法创建正则表达式来测试这种情况(我的第一篇文章是 "to use OR (|) inside a group",我真的希望尝试 2 或 3 能奏效)。

预期结果是:

a
## [1] "SOCORRO"  "SANTANDER DE QUILICHAO"  "LOS PATIOS"  "LOS PATIOS"

我们可以试试

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"  
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(),因为我们不需要在同一个字符串中匹配多次。
  • 括号表达式将仅匹配单个字符,因此不适用于此正则表达式。
  • 美元字符仅在括号表达式之外时才特殊。
  • 您似乎尝试过使用同一个正则表达式匹配缩写词和全长词。我建议不要这样做;它们在概念上是完全不同的部分。如果一个词和它的缩写碰巧共用一个后缀,那是偶然的;您不应该围绕该事实构建正则表达式。因此,我认为这里的交替是最合适的。