如何使用?删除字符向量内的单词之间的额外空格?

时间:2013-10-02 00:50:15

标签: regex r

假设我有一个像

这样的字符向量
"Hi,  this is a   good  time to   start working   together.". 

我只想拥有

" Hi, this is a good time to start working together." 

两个单词之间只有一个空格。我该怎么做R?

3 个答案:

答案 0 :(得分:33)

gsub是你的朋友:

test <- "Hi,  this is a   good  time to   start working   together."
gsub("\\s+"," ",test)
#[1] "Hi, this is a good time to start working together."

\\s+将匹配任何空格字符(空格,制表符等)或重复空格字符,并将其替换为单个空格" "

答案 1 :(得分:1)

另一个选项是字符串库中的压扁函数

library(stringr)
string <- "Hi,  this is a   good  time to   start working   together."
str_squish(string)
#[1] ""Hi, this is a good time to start working together.""

答案 2 :(得分:0)

由于问题的标题是“删除多余的空格单词之间”,不触及前导和尾随空格,答案是(假设“单词”是非空白字符块)

gsub("(\\S)\\s{2,}(?=\\S)", "\\1 ", text, perl=TRUE)
stringr::str_replace_all(text, "(\\S)\\s{2,}(?=\\S)", "\\1 ")
## Or, if the whitespace to leep is  the last whitespace in those matched
gsub("(\\S)(\\s){2,}(?=\\S)", "\\1\\2", text, perl=TRUE)
stringr::str_replace_all(text, "(\\S)(\\s){2,}(?=\\S)", "\\1\\2")

参见 regex demo #1regex demo #2this R demo

正则表达式详情

  • (\S) - 捕获组 1(\1 从替换模式中引用此组值):非空白字符
  • \s{2,} - 两个或多个空白字符(在 Regex #2 中,它用括号括起来以形成 ID 为 2 (\2) 的捕获组)
  • (?=\S) - 正向前瞻,需要在当前位置的右侧紧接一个非空白字符。