在R中同时替换所有变形虫(使用正则表达式)

时间:2016-10-29 20:08:23

标签: r regex

我有德语文本,我想用ae,oe,ue等替换所有变音符号(ä,Ä,ü,Ü,ö,Ö)。

我可以单独执行(通过将每个替换保存到新文件中):

gsub(pattern = '[ä]', replacement = "ae",text)
gsub(pattern = '[ü]', replacement = "ue",text)
gsub(pattern = '[ö]', replacement = "oe",text)

但是我可以在一个命令中完成它(包括用Ae,Oe和Ue替换大写字母等)吗?

我可以用正则表达式吗?

3 个答案:

答案 0 :(得分:3)

你可以尝试

# install.packages("stringi) # uncomment & run if needed
str <- c("äöü", "ÄÖÜ")
stringi::stri_replace_all_fixed(
  str, 
  c("ä", "ö", "ü", "Ä", "Ö", "Ü"), 
  c("ae", "oe", "ue", "Ae", "Oe", "Ue"), 
  vectorize_all = FALSE
)
# [1] "aeoeue" "AeOeUe"

答案 1 :(得分:1)

根据运行R的操作系统的语言环境和输入字符串的编码,此处的某些解决方案可能会或可能不会起作用。在不同的操作系统和不同的语言设置下,我曾多次遇到此问题。目前,我正在使用德语Windows 10开发R,但有时会在英语Ubuntu VM上运行代码。

在Windows和Ubuntu下,de_DE和en_US都非常快速且可靠的解决方案是以下解决方案: https://github.com/gagolews/stringi/issues/269#issuecomment-488623874

> stringi::stri_trans_general("ä ö ü ß", "de-ASCII; Latin-ASCII")
[1] "ae oe ue ss"

ICU转换ID内的;使它成为“复合ID”。有关更多信息,请参见?stri_trans_general

答案 2 :(得分:0)

有几种方法。以上建议在stringistringr软件包中使用其中两个。

另一种解决方案使用gsubfn软件包。

text <- "ae = ä und oe = ö, UE = Ü. I also want Ä to be AE and not Ae"

# Solution depends on extra package "gsubfn"
require(gsubfn)
gsubfn(".", list("ä"="ae", "ö"="oe", "ü"="ue", "Ä" = "AE", "Ö" = "OE", "Ü" = "UE"), text)

当然,我们也可以编写我们自己的函数,因为您可能不希望仅仅因为需要一个函数而加载软件包(我个人试图避免这种情况)。

# Solution 1
replace_umlauts <- function(x) {
  umlauts <- "äöü"
  UMLAUTS <- "ÄÖÜ"
  x <- gsub(pattern = paste0("([", UMLAUTS, "])"), replacement = "\\1E", x)
  x <- gsub(pattern = paste0("([", umlauts, "])"), replacement = "\\1e", x)
  x <- chartr(old = paste0(UMLAUTS, umlauts), new = "AOUaou", x)
  return(x)
}
replace_umlauts(text)

有趣的部分是基准。

require(microbenchmark)
require(stringi)
require(stringr)
require(gsubfn)
microbenchmark(
  myown = replace_umlauts(text),
  stringi = stringi::stri_replace_all_fixed(text, c("ä", "ö", "ü", "Ä", "Ö", "Ü"), c("ae", "oe", "ue", "AE", "OE", "UE"), vectorize_all = FALSE),
  stringr = stringr::str_replace_all(text, c("ü" = "ue", "ä" = "ae", "ö" = "oe", "Ä" = "AE", "Ö" = "OE", "Ü" = "UE")), 
  gsubfn = gsubfn(".", list("ä"="ae", "ö"="oe", "ü"="ue", "Ä" = "AE", "Ö" = "OE", "Ü" = "UE"), text),
  times = 500L
)

结果是:

Unit: microseconds
    expr   min      lq      mean  median     uq    max neval
   myown  18.1   23.50   28.8510   30.45   32.6   63.3   500
 stringi  10.5   14.10   17.3808   17.80   19.8   46.3   500
 stringr 332.3  353.40  375.5458  371.85  387.5  586.1   500
  gsubfn 996.5 1042.55 1104.7458 1057.45 1075.2 7547.5   500

最快的解决方案是stringi::stri_replace_all_fixed。 IOt的速度几乎是次优解决方案的两倍,比stringr快10倍。关于速度,唯一可接受的替代方法是自制replace_umlauts函数。