regex - gsub 替换并保留大小写

标签 regex r

我一直在使用 gsub 来缩写较长字符串中的单词。我想缩写一个单词,然后尽可能多地继承输入的大写形式。

例如,将 hello 改为 hi:

x <- c("Hello World", "HELLO WORLD", "hello world", "hElLo world")

但请尊重原文中 hello 的大小写

c("Hi World", "HI WORLD", "hi world", "hI world")

我真正想要匹配的大多数示例是“HI”“hi”和“Hi”。我不太关心“hI”,但为了完整起见,我将其保留为一种可能性。

到目前为止,为了完成这项工作,我采用了维护目标和替换字符串向量的繁琐方法

xin <- c("Hello\ ", "HELLO\ ", "hello\ ", "hElLo\ ")
xout <- c("Hi ", "HI ", "hi ", "hI ")
mapply(gsub, xin, xout, x)

这给出了正确的答案,请参阅:

     Hello      HELLO      hello      hElLo
"Hi World" "HI WORLD" "hi world" "hI world"

但这很尴尬、耗时且不灵活!到目前为止,我有一个 50 个单词的家族,我们正在寻求缩写,并且保留所有大小写组合很烦人。

这些数据充满了混合大小写的数据困惑,因为人类输入了大约 78000 条记录,并且他们以各种可以想象的方式将“部门”和“大学”等单词大写。他们输入的长句子不适合打印页面上允许的空间,我们被要求将它们缩短为“dept”和“univ”。如果可能的话,我们希望保留大写。

我唯一的想法在我看来不太像 R。拆分原始输入,将前 2 个字母的现有大小写制成表格。

xcap <- sapply(strsplit(x, split = ""), function(x) x %in% LETTERS)[1:2, ]
> t(xcap)
      [,1]  [,2]
[1,]  TRUE FALSE
[2,]  TRUE  TRUE
[3,] FALSE FALSE
[4,] FALSE  TRUE

我非常确定我可以使用该大小写信息来使这项工作正常进行。但我还没有成功。我刚刚意识到 G Grothendieck 的包 gsubfn 可能有用,但其中的术语(“原始”对象)对我来说是新的。

我可能会继续朝这个方向前进,但现在我想问是否有更直接的路线。

pj

最佳答案

你的想法启发了我编写这段代码。它是在一个 sapply block 中完成的。 toupper函数用于将xout字符串的分割字符大写。

x <- c("Hello World", "HELLO WORLD", "hello world", "hElLo world")

sapply(x, function(x,xout) {
  xcap<-(unlist(strsplit(unlist(strsplit(x," "))[1],"")) %in% LETTERS)
  n<-nchar(xout)
  if(length(xcap)>=n) {
   xcap<-xcap[1:n]
  }else {
    xcap<-c(xcap,rep(tail(xcap,1),n-length(xcap)))
    }
  xout<-paste(sapply(1:n,function(x) {
    if(xcap[x]) toupper(unlist(strsplit(xout,""))[x])
    else unlist(strsplit(xout,""))[x]
    }),sep = "",collapse = "")
  xin<-"hello"
  gsub(xin,xout,x[1],ignore.case = T)
  },xout="selamlar")

[output with "selamlar"]
 Hello World      HELLO WORLD      hello world      hElLo world 
"Selamlar World" "SELAMLAR WORLD" "selamlar world" "sElAmlar world" 

[output with "hi"]
Hello World HELLO WORLD hello world hElLo world 
"Hi World"  "HI WORLD"  "hi world"  "hI world" 

关于regex - gsub 替换并保留大小写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32304688/

相关文章:

java - 替换打印流中的文本

r - mxnet 中 LSTM RNN 出现错误(R 环境)

r - 如何使用 R Markdown 显式设置 R DT 表的列宽?

r - 在开发 R 包时包含数据示例

javascript includes() 不区分大小写

Python 表情符号搜索和替换未按预期工作

javascript - 在 Javascript 中从逗号分隔的字符串中获取所有值

r - 如何计算平均生存时间

r - dplyr,总结分类变量

regex - Perl 中的 qr/和 m/有什么区别?