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