stringr - 删除多余空格,但保留换行符(\n,\r)

5

我正在处理一些原始文本,并希望将所有的多个空格替换为一个空格。通常,我会使用stringr的 str_squish函数来实现,但不幸的是它也会删除换行符(\n和\r),而我需要保留。

有什么好的方法吗?以下是我的尝试。非常感谢!

library(tidyverse)
x <- "hello     \n\r how are you \n\r    all good?"
str_squish(x)
#> [1] "hello how are you all good?"
str_replace_all(x, "[:space:]+", " ")
#> [1] "hello how are you all good?"
str_replace_all(x, "\\s+", " ")
#> [1] "hello how are you all good?"

这段内容创建于2020年7月1日,使用了reprex包(v0.3.0)

2个回答

4

使用 stringr,您可以使用\h 速记字符类来匹配任何水平空白。

library(stringr)
x <- "hello     \n\r how are you \n\r    all good?"
x <- str_replace_all(x, "\\h+", " ")
## [1] "hello \n\r how are you \n\r all good?"

在基本的R中,您也可以使用PCRE模式:

gsub("\\h+", " ", x, perl=TRUE)

请查看在线 R 示范
如果您计划匹配除了 CR 和 LF 符号之外的任何空格(包括一些 Unicode 换行符),您可以直接使用[^\S\r\n]模式。
str_replace_all(x, "[^\\S\r\n]+", " ")
gsub("[^\\S\r\n]+", " ", x, perl=TRUE)

2

在正则表达式中,您可以使用字面空格而不是 \\s[:space:]

str_replace_all(x, " +", " ") %>%
    cat()

hello 
 how are you 
 all good?

您还可以使用[ \t][:blank:]\\h代替 来包含制表符。在这种情况下,您可能需要使用{2,}来选择2个或更多相同的选择器,以便您不必两次编写模式(即[:blank:][:blank:]+):

y <- "hello     \n\r\t\thow are you \n\r    all   good?"

str_replace_all(y, "[:blank:]{2,}", " ") %>%
    cat()

hello 
 how are you 
 all good?

3
还有[[:blank:]]可以去掉空格和制表符。由于 OP 只想在存在两个或多个空格时进行替换,因此你也可以明确说明 [[:blank:]]{2,},尽管显然会得到相同的结果。 - rpolicastro

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接