Как удалить все пробелы из строки?

111

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

Теги:
string
grep
r-faq

7 ответов

199
Лучший ответ

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

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
  • 1
    @Aniko. Есть ли причина, по которой вы использовали fixed = TRUE?
  • 1
    @DWin Возможно, это быстрее, если R знает, что ему не нужно вызывать регулярные выражения. В этом случае это на самом деле не имеет никакого значения, я просто привык это делать.
Показать ещё 6 комментариев
15

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

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

[1] "xxyy112233"
  • 3
    Пакет stringr не работает хорошо с каждой кодировкой. Пакет stringi - лучшее решение, для получения дополнительной информации проверьте github.com/Rexamine/stringi
7

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

library(stringi)
stri_replace_all_charclass("   ala \t  ma \n kota  ", "\\p{WHITE_SPACE}", "")
## [1] "alamakota"
  • 4
    stringi пакет на CRAN сейчас, наслаждайтесь! :)
  • 1
    Эта команда выше неверна. Правильный путь - stri_replace_all_charclass ("ala \ t ma \ n kota", "\\ p {WHITE_SPACE}", "")
Показать ещё 1 комментарий
6

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

gsub("[[:blank:]]", "", " xx yy 11 22  33 ")
# [1] "xxyy112233"
4
x = "xx yy 11 22 33"

gsub(" ", "", x)

> [1] "xxyy112233"
3

Функция 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
  • 4
    Пожалуйста, не связывайтесь с кодом. Добавьте его в текстовое тело вашего ответа и объясните здесь, чтобы придать вашему ответу более долгосрочную ценность.
  • 0
    Спасибо @RBalasubramanian за напоминание об этом руководстве. Я буду следить за этим в будущем.
Показать ещё 1 комментарий
0

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

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню