在所有空格和标点符号(除了撇号)处进行strsplit

6
我曾在这里这里询问有关问题。尝试过归纳总结答案,但失败了。
基本上,我想把一个字符串分成单词、数字和任何类型的标点符号,但是我想保留撇号。以下是我尝试过的,我认为很接近:
x <- "Raptors don't like robots! I'd pay $500.00 to rid them."

strsplit(x, "(\\s+)|(?=[[:punct:]])", perl = TRUE)

## [[1]]
##  [1] "Raptors" "don"     "'"       "t"       "like"    "robots"  "!"             
##  [8] ""   "I"   "'"    "d"  "pay"     "$"       "500"     "."       "00"      "to"         
## [20] "rid"   "them"    "."  

以下是我想要的内容:

## [[1]]
##  [1] "Raptors" "don't"       "like"    "robots"  "!"       ""        "I'd"      
##  [8] "pay"     "$"       "500"   "."   "00"  "to"      "rid"     "them"    "."  

虽然我希望得到一个基本的解决方案,但我想看看其他的解决方案(我相信有人有一个stringr的解决方案),这将使问题更具普适性。

注意:R语言有一个特定的正则表达式系统。您需要了解R语言才能回答此问题。


1
(好奇)R的正则表达式有什么特别之处? - Jongware
我很困惑,你提供的第一个链接与这个问题不完全相同吗? - eddi
@Jongware,例如转义特殊字符存在问题。 - Tyler Rinker
@eddi 第一个问题是删除字符,但这里我不想删除它们,我需要它们。我使用了那两个问题的信息来帮助我尽可能地接近(相似但不完全相同)。 - Tyler Rinker
@TylerRinker 你能用一个例子来解释一下吗?对于你目前的示例:identical(strsplit(x, "[[:space:]]|(?=[^'[:^punct:]])", perl=TRUE), strsplit(x, "(\\s+)|(?!')(?=[[:punct:]])", perl = TRUE)) # [1] TRUE - eddi
@eddi 你说得对。我当时是在测试逗号,所以我认为它们是不同的情况,但实际上另一个解决方案明确表示不要在逗号处分割。我投了关闭票。 - Tyler Rinker
1个回答

5
你可以使用负向先行断言(?!')
strsplit(x, "(\\s+)|(?!')(?=[[:punct:]])", perl = TRUE)
#  [1] "Raptors" "don't"   "like"    "robots"  "!"       ""        "I'd"     "pay"     "$"       "500"     "."       "00"      "to"      "rid"     "them"    "."

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接