删除所有不必要的空格和一些标点符号

时间:2014-10-30 16:04:26

标签: regex r

考虑以下字符串

str1 <- "  say    wut      ??   "

我想删除单词和??之间的所有额外空格并修剪整个内容

所以以下工作完美

gsub("(^ *)|( +(?= ))|( $)", "", str1, perl = TRUE)
## [1] "say wut ??"

现在,如果我有以下字符串

str2 <- "[ ] say[]    wut      ??  [] "

我希望达到之前的结果(我想删除除??之外的所有标点符号,因为在现实生活中我还有其他标点符号,我想保留。换句话说,我只想删除[]和不必要的空格

所以我尝试了下面的内容,但是我的领先空间已经恢复了

gsub("\\]|\\[|(^ *)|( +(?= ))|( $)", "", str2, perl = TRUE)
## [1] "  say wut ?? "

有趣的是(否),当颠倒正则表达式顺序时,一切都会更加混乱

gsub("(^ *)|\\]|\\[|( +(?= ))|( $)", "", str2, perl = TRUE)
## [1] "[  say wut ?? "

编辑:似乎我不够清楚,但我正在寻找一个干净的正则表达式解决方案。我很清楚你可以在几个步骤中做几乎任何事情(我已经这样做了),但这不是我想要的。

这是我到目前为止使用的(两步解决方案):

gsub("(^ *)|( +(?= ))|( $)", "", gsub("\\]|\\[", "", x), perl = TRUE)

5 个答案:

答案 0 :(得分:4)

@DavidArenburg,起初我的头脑缠绕着问题的主要部分:

  

“我想删除单词??之间的所有额外空格并修剪整个内容”

但是,你的表达式没有达到预期效果的原因我现在看到的原因是你没有考虑括号字符之前或之间的空格与你使用交替的方式,这就是我说你需要级联的原因要求这样做。一个删除空格然后删除括号字符。

然后意识到包含“前导/尾随括号字符和空格”的逻辑就是你所需要的。

x <- c('  say    wut      ??   ', 
       '[ ] say[]    wut      ??  [] ', 
       '[ ] say[] wut ?? [] ',
       '[say ] wut ??',
       '   say  ]  [ wut ?? ]')

gsub('^([[\\] ]+)|([[\\]]+)| +(?2)?(?= )|(?1)$', '', x, perl=T)
# [1] "say wut ??" "say wut ??" "say wut ??" "say wut ??" "say wut ??"

答案 1 :(得分:3)

您可以使用 gsub和以下正则表达式来解决此问题。

x <- c('  say    wut      ??   ', 
       '[ ] say[]    wut      ??  [] ', 
       '[ ] say[] wut ?? [] ',
       '[say ] wut ??')

gsub("^[[\\] ]+|[[\\] ]+$|[[\\]]| +([[\\]]+)?(?= )", "", x, perl = TRUE)
# [1] "say wut ??" "say wut ??" "say wut ??" "say wut ??"

它如何运作?

此正则表达式查找与逻辑"|")组合的4种不同模式:

  • "^[[\\] ]""^"表示字符串的开头。括号用于匹配任何指定的字符,即"[""]"" "。请注意,我不需要在括号中转义"[""+"表示一个或多个匹配。
  • "[[\\] ]+$":与第一个模式类似,但"$"表示字符串的结尾。
  • "[[\\]]""[""]"之一。
  • " +([[\\]]+)?(?= )":一个或多个空格(" +"),可选("?"),后跟一个或多个"[""]",后跟空格("(?= )")。

答案 2 :(得分:2)

这样可行,

> x <- "[ ] say[]    wut      ??  [] "
> gsub("^\\s*\\[?\\s*\\]?\\s*|\\s*\\[?\\s*\\]?\\s*$|\\[?\\s*\\]?\\s*(?=\\s)", "", x, perl=T)
[1] "say wut ??"

答案 3 :(得分:2)

对于未来的搜索者来说,这是一个更好的答案,因为它提供了所需的输出,但不是通过提供正则表达式。 qdapRegex包具有rm_square功能,可删除方括号。该函数还默认清理空白区域,因此它很容易完成此任务:

x <- c('  say    wut      ??   ', '[ ] say[]    wut      ??  [] ', '[ ] say[] wut ?? [] ')

library(qdapRegex)
rm_square(x)

## [1] "say wut ??" "say wut ??" "say wut ??"

答案 4 :(得分:1)

正则表达式怎么样

[\s\[\]]+

替换字符串是空格(

gsub("[]\s\[\]]+", " ", str2, perl = TRUE)

将产生

" say wut ?? "

查看它与http://regex101.com/r/eJ4rY5/2

的匹配方式

如果要删除起始和尾随空格

(^\s|\s$) 会很有用的

gsub("(^\s|\s$)", "", " say wut ?? ", perl = TRUE)

会给出

"say wut ??"