2014-10-30 48 views
1

考虑以下字符串删除所有不必要的空间和一定的标点符号

str1 <- " say wut  ?? " 

我想删除单词和??之间的所有额外的空间和装饰,整个事情

所以下面的作品完美

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

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

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

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

所以我已经试过以下,但我有我的前导空格后面

​​

有趣的(或没有),当倒车正则表达式秩序,一切都弄糟更

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

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

这是我用什么到现在为止(两个步骤的解决方案):

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

回答

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种不同的模式:

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

它似乎仍然会在'x < - '[说] w w ??' – 2014-11-02 08:55:51

+0

@DavidArenburg看到更新。 – 2014-11-02 13:38:59

+0

感谢您的更新 – 2014-11-04 09:07:09

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 ??"

+0

不工作:错误:“\ S”是在字符串中未被识别逃逸开始“ – Baumann 2014-10-30 16:20:27

+0

既不的” [\ S]”这些解决了我的问题对不起,在R中你需要用双斜杠来转义元字符,也就是说,而不是'\ s'它应该是'\\ s'等 – 2014-10-30 17:40:15

+0

给你+1(+1) “[] \\ s \\ [\\]] +' – 2014-10-30 18:18:35

2

这会工作,

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

如果x = str1 – Baumann 2014-10-30 16:18:39

+0

评论受欢迎,这个解决方案保持开始和结束的白色空间..对不起,我没有得到你。 – 2014-10-30 16:20:29

+0

如果:x < - “说wut ??”,那么你的解决方案的结果是:“说wut ??”而不是“说wut ??” – Baumann 2014-10-30 16:22:13

4

@DavidArenburg,起初我有我的头上缠了问题的要点进行说明:

"I want to remove all additional spaces between words and ?? and trim the whole thing"

然而,原因你的表情并没有达到你所期望的,我现在看到的是因为你没有考虑到你使用替换方式的方括号之前或之间的空格,这就是为什么我说你很害怕d需要级联调用来执行此操作。一个删除空格,然后括号字符。

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

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 ??" 
+0

感谢您的编辑。 – 2014-10-31 08:13:27

+0

似乎它仍然会在'x < - '[说]wüt'中留下额外的空间''似乎双'gsub'仍然是最好的答案 – 2014-11-02 08:31:53

+0

@DavidArenburg更新了编辑。 – hwnd 2014-11-02 17:05:33

2

对于未来的搜索者,这是一个更好的答案,因为它提供了期望的输出,而不是通过给定正则表达式。 qdapRegex包有rm_square功能,可以去除方括号。该功能也默认为清理空格所以碟刹这个任务很简单:

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

library(qdapRegex) 
rm_square(x) 

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

这绝对是真棒,究竟是什么给你创造这个奇怪的功能的想法:)? – 2014-10-31 08:12:33

+0

它是删除括号的函数族的一部分,请参阅'?rm_square'。这对删除括号和之间的所有信息很有用。 – 2014-10-31 15:24:52

+0

现在我已经测试了一下,发现它也删除了括号内的内容(不仅括号)。也就是'x < - '[说] wut ??''不会给我想要的结果 – 2014-11-02 08:30:01

相关问题