2014-10-30 63 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

相關問題