替换保持区分大小写的字符串

时间:2015-12-13 23:09:28

标签: r string gsub

基本上我有2个字符向量:

x='XYzD- xyZ      ABC'
y='xyz'

这是我能做的最好的事情。

gsub(paste0('[^ ',y,' $\\$]'), 'X', x, ignore.case = T)

所需的输出是:

   'XXxXX xyZ      XXX' 

这意味着只有匹配的字符串,即y(' abc')应该保留,否则所有内容都会转换为字母' X / x'取决于资本化。

举一个明确的例子:

x='XYzD- LMn      ABC'
y='lmn'

gsub(paste0('[^ ',y,' $\\$]'), 'X', x, ignore.case = T)
在这种情况下,

期望的输出将是

'XXxXX LMn      XXX' 

我希望这能使事情变得清晰。

2 个答案:

答案 0 :(得分:1)

这是一个很长的解决方案。但它的确有效。我正在使用你的第二个例子。基本上,我将所有内容转换为单个字符,在原始字符中查找小写字母并将tolower应用于结果。然后我将所有内容连接回字符串。

x='XYzD- LMn      ABC'
y='lmn'

out <-gsub(paste0('[^ ',y,' $\\$]'), 'X', x, ignore.case = TRUE)

xx <-unlist(strsplit(x,"")) #split characters on original
out2 <-unlist(strsplit(out,"")) #split characters on result

lower <-grepl("[[:lower:]]",xx) #find lowercase
out2[lower] <-tolower(out2[lower]) #replace lowercase
paste(out2, collapse = "") #concatenate
#[1] "XXxXX LMn      XXX"

答案 1 :(得分:0)

这是一个使用嵌套gsubs的纯正则表达式解决方案。关于大写字母的第一个gsub的结果之后是第二个gsub来处理降低...

gsub(paste0("[^", y, toupper(y), "A-Z", " ]"), 'x', 
        gsub( paste0("[^", y, toupper(y), "a-z", " ]"), 'X', x) )
[1] "XXxXX LMn      XXX"

它依赖于正则表达式中的范围运算符,它在某种程度上取决于操作系统,而且正则表达式页面上有关于它的使用的警告,你应该阅读。