如何从字符串中删除所有空格?


Answers:


258

通常,我们需要一个矢量化的解决方案,因此这里有一个更好的测试示例:

whitespace <- " \t\n\r\v\f" # space, tab, newline, 
                            # carriage return, vertical tab, form feed
x <- c(
  " x y ",           # spaces before, after and in between
  " \u2190 \u2192 ", # contains unicode chars
  paste0(            # varied whitespace     
    whitespace, 
    "x", 
    whitespace, 
    "y", 
    whitespace, 
    collapse = ""
  ),   
  NA                 # missing
)
## [1] " x y "                           
## [2] " ← → "                           
## [3] " \t\n\r\v\fx \t\n\r\v\fy \t\n\r\v\f"
## [4] NA

基本R方法: gsub

gsub用另一个字符串替换字符串(fixed = TRUE)或正则表达式(fixed = FALSE默认值)的所有实例。要删除所有空格,请使用:

gsub(" ", "", x, fixed = TRUE)
## [1] "xy"                            "←→"             
## [3] "\t\n\r\v\fx\t\n\r\v\fy\t\n\r\v\f" NA 

正如DWin所指出的,在这种情况下fixed = TRUE不是必需的,但是由于匹配固定字符串比匹配正则表达式要快,因此性能稍好。

如果要删除所有类型的空格,请使用:

gsub("[[:space:]]", "", x) # note the double square brackets
## [1] "xy" "←→" "xy" NA 

gsub("\\s", "", x)         # same; note the double backslash

library(regex)
gsub(space(), "", x)       # same

"[:space:]"是R特定的正则表达式组,与所有空格字符匹配。 \s是与语言无关的正则表达式,可以执行相同的操作。


stringr方法:str_replace_allstr_trim

stringr在基本R函数的周围提供了更多易于理解的包装器(尽管自2014年12月起,开发版本在的顶部建立了一个分支stringi,如下所述)。使用[]的上述命令的等效项str_replace_all][3]是:

library(stringr)
str_replace_all(x, fixed(" "), "")
str_replace_all(x, space(), "")

stringr还具有str_trim仅删除前导和尾随空格的功能。

str_trim(x) 
## [1] "x y"          "← →"          "x \t\n\r\v\fy" NA    
str_trim(x, "left")    
## [1] "x y "                   "← → "    
## [3] "x \t\n\r\v\fy \t\n\r\v\f" NA     
str_trim(x, "right")    
## [1] " x y"                   " ← →"    
## [3] " \t\n\r\v\fx \t\n\r\v\fy" NA      

stringi方法:stri_replace_all_charclassstri_trim

stringi基于独立于平台的ICU库构建,并具有广泛的字符串操作功能集。上面的等效项是:

library(stringi)
stri_replace_all_fixed(x, " ", "")
stri_replace_all_charclass(x, "\\p{WHITE_SPACE}", "")

这里"\\p{WHITE_SPACE}"是对于该组被认为是空白,相当于Unicode码位的替换的语法"[[:space:]]""\\s"space()。对于更复杂的正则表达式替换,还有stri_replace_all_regex

stringi还具有修剪功能

stri_trim(x)
stri_trim_both(x)    # same
stri_trim(x, "left")
stri_trim_left(x)    # same
stri_trim(x, "right")  
stri_trim_right(x)   # same

2
@Aniko。您是否有理由使用fixed = TRUE?
IRTFM

2
@DWin如果R知道它不必调用正则表达式的东西,则可以更快。在这种情况下,它实际上并没有任何区别,我只是习惯这样做。
Aniko

有没有之间的差异"[[:space:]]""\\s"
2011年

5
如果您检查flyordie.sin.khk.be/2011/05/04/day-35-replacing-characters或仅键入?regex,那么您会看到[:space:]用于“空格字符:制表符,换行符,垂直标签,换页,回车和空格。” 这不仅是空间的问题
希尔塞姆爵士(Ksilem)先生2011年

1
@Aniko希望您不要介意大的编辑。由于此问题非常受欢迎,因此看起来需要更彻底的答案。
Richie Cotton

18

我刚刚了解了“ stringr”包,该包使用str_trim(,side =“ both”)从字符串的开头和结尾删除空格,但是它也具有替换功能,因此:

a <- " xx yy 11 22 33 " 
str_replace_all(string=a, pattern=" ", repl="")

[1] "xxyy112233"

3
字符串包不适用于每种编码。stringi软件包是更好的解决方案,有关更多信息,请查看github.com/Rexamine/stringi
bartektartanus 2014年

8

请注意,以上文字说明仅可删除空间。如果您还想stri_replace_all_charclassstringi包中删除制表符或换行符,请使用。

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"

4
stringi包现在在CRAN上,请尽情享受!:)
bartektartanus 2014年

1
上面的此命令不正确。正确的方法是stri_replace_all_charclass(“ ala \ t ma \ n kota”,“ \\ p {WHITE_SPACE}”,“”)
Lucas Fortini 2014年

5
在使用stringi了几个月之后,看到/了解了它的功能和效率,它已经成为我进行字符串操作的首选软件包。你们做了很棒的工作。
Rich Scriven 2014年


6
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"

4

tidyverse str_squish()stringr中的功能神奇!

library(dplyr)
library(stringr)

df <- data.frame(a = c("  aZe  aze s", "wxc  s     aze   "), 
                 b = c("  12    12 ", "34e e4  "), 
                 stringsAsFactors = FALSE)
df <- df %>%
  rowwise() %>%
  mutate_all(funs(str_squish(.))) %>%
  ungroup()
df

# A tibble: 2 x 2
  a         b     
  <chr>     <chr> 
1 aZe aze s 12 12 
2 wxc s aze 34e e4

4
请不要链接到代码。将其添加到答案的正文中并在此处进行说明,以使您的答案更具长期价值。
R Balasubramanian

感谢@RBalasubramanian提醒我该指南。以后我会关注。
damianooldoni '18年

我看不出这如何回答问题。str_squish不会删除所有空格。它只是修剪并用多个空格代替一个。
荨麻

0

这样,您可以从数据框中的所有字符变量中删除所有空格。如果您只想选择某些变量,请使用mutatemutate_at

library(dplyr)
library(stringr)

remove_all_ws<- function(string){
    return(gsub(" ", "", str_squish(string)))
}

df<-df %>%  mutate_if(is.character, remove_all_ws)


-1

从字符串库,您可以尝试以下操作:

  1. 删除连续的填充空白
  2. 删除填充空白

    库(字符串)

                2.         1.
                |          |
                V          V
    
        str_replace_all(str_trim(" xx yy 11 22  33 "), " ", "")
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.