2012-10-17 119 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 –