Как удалить все пробелы из строки? - PullRequest
123 голосов
/ 13 мая 2011

Так " xx yy 11 22 33 " станет "xxyy112233".Как мне этого добиться?

Ответы [ 7 ]

215 голосов
/ 13 мая 2011

В общем, нам нужно решение, которое векторизовано, поэтому вот лучший тестовый пример:

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_all и str_trim

stringr обеспечивает большеудобочитаемые оболочки вокруг базовых функций R (хотя по состоянию на декабрь 2014 года версия для разработки имеет ветку, построенную поверх 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_charclass и stri_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
16 голосов
/ 26 июня 2013

Я только что узнал о пакете "stringr" для удаления пробелов из начала и конца строки с помощью str_trim (, side = "both"), но он также имеет функцию замены, так что:

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

[1] "xxyy112233"
7 голосов
/ 01 октября 2015

Используйте [[:blank:]] для соответствия любым горизонтальным символам белого пространства.

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"
7 голосов
/ 16 июля 2013

Обратите внимание, что вышеперечисленные слова убирают только пробел. Если вы также хотите удалить вкладку или новую строку, используйте stri_replace_all_charclass из пакета stringi.

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
6 голосов
/ 26 сентября 2017
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"
4 голосов
/ 07 августа 2018

Функция str_squish() из пакета stringr Tidyverse делает волшебство!

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
0 голосов
/ 29 августа 2018

Вы можете попробовать это:

  1. Удаление последовательных пробелов заполнения
  2. Удалить заполнить бланк

            2.         1.
            |          |
            V          V
    
    
    display subinstr(stritrim(" xx yy 11 22  33 "), " ", "",.)
    
...