2012-10-17 164 views
10

我有一個需要分割的話和結束標記(某些類型的標點符號)。奇怪的管道(「|」)可以算作結束標記。我有代碼在結束標記上的單詞,直到我嘗試添加管道。添加管道使得每個字符都是strsplit。轉義它導致錯誤。我如何在正則表達式中包含管道?逃脫管道(「|」)在正則表達式

x <- "I like the dog|." 

strsplit(x, "[[:space:]]|(?=[.!?*-])", perl=TRUE) 
#[[1]] 
#[1] "I" "like" "the" "dog|" "." 

strsplit(x, "[[:space:]]|(?=[.!?*-\|])", perl=TRUE) 
#Error: '\|' is an unrecognized escape in character string starting "[[:space:]]|(?=[.!?*-\|" 

的結果,我想:

#[[1]] 
#[1] "I" "like" "the" "dog" "|" "." #pipe is an element 
+0

我總是猶豫不決,把R上的正則表達式的問題正則表達式的標籤,因爲你從其他語言regexers,雖然答案是相似的,他們不重疊。 –

回答

16

一種方法是使用\Q...\E符號去除...的任意字符的特殊含義。因爲它說,在?regex

如果你想從 字符序列中刪除的特殊意義,你可以把它們「\ Q」和「\ E」之間這樣做。這 是Perl的不同之處在於「$」和「@」在 作爲文字進行處理「\ Q ... \ E」在PCRE序列,而在Perl中,「$」和「@」的原因 變量代換。

例如:

> strsplit(x, "[[:space:]]|(?=[\\Q.!?*-|\\E])", perl=TRUE) 
[[1]] 
[1] "I" "like" "the" "dog" "|" "." 
+0

有趣。我肯定需要更多地閱讀正則表達式。 +1 – A5C1D2H2I1M1N2O1R2T1

+0

@Joshua,mrdwab給予了極大的答案,這甚至是更徹底。我甚至從來沒有聽說過'\\ Q ... \ E'的事情。非常有用的信息。 –

+0

@TylerRinker:我從來沒有聽說過的,要麼,直到我讀看到你的問題後的文檔。 ;-) –

12

這個問題實際上是你的連字符,這應該是來要麼first or last

strsplit(x, "[[:space:]]|(?=[|.!?*-])", perl=TRUE) 
strsplit(x, "[[:space:]]|(?=[.|!?*-])", perl=TRUE) 
strsplit(x, "[[:space:]]|(?=[.!|?*-])", perl=TRUE) 
strsplit(x, "[[:space:]]|(?=[-|.!?*])", perl=TRUE) 

等等都應該給你的輸出你正在尋找。

您也可以逃避連字符,如果你喜歡,但記得要使用兩個反斜槓!要解決這個

strsplit(x, "[[:space:]]|(?=[.!?*\\-|])", perl=TRUE) 
+0

這兩個優秀的答案,喬什給了更多的細節。謝謝你的回答+1 –