基本上我有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'
我希望这能使事情变得清晰。
答案 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"
它依赖于正则表达式中的范围运算符,它在某种程度上取决于操作系统,而且正则表达式页面上有关于它的使用的警告,你应该阅读。