14

我需要拆分单词和结束标记(某些类型的标点符号)。奇怪的管道(“|”)可以算作结束标记。在我尝试添加管道之前,我已经在结束标记上编写了代码。添加管道使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
4

2 回答 2

19

解决此问题的一种方法是使用\Q...\E符号来删除.... 正如它所说?regex

如果要从字符序列中删除特殊含义,可以将它们放在“\Q”和“\E”之间。这与 Perl 的不同之处在于 '$' 和 '@' 在 PCRE 中的 '\Q...\E' 序列中作为文字处理,而在 Perl 中,'$' 和 '@' 会导致变量插值。

例如:

> strsplit(x, "[[:space:]]|(?=[\\Q.!?*-|\\E])", perl=TRUE)
[[1]]
[1] "I"    "like" "the"  "dog"  "|"    "."
于 2012-10-17T18:44:59.137 回答
12

问题实际上是您的连字符,它应该出现在第一个或最后一个

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)
于 2012-10-17T18:35:20.343 回答