【发布时间】:2022-01-10 09:52:43
【问题描述】:
如果“like”是字符串中的第一个单词,我正在努力提取单词的现有和缺失的左侧搭配,例如“like”:
test_string = c("like like like lucy she likes it and she's always liked it.")
使用 str_extract_all 和否定字符类 \\S 我已经接近了 - 但还不够接近(奇怪的是,第二个搭配的“l”被省略了):
library(stringr)
unlist(str_extract_all(test_string, "(^|\\S+)(?=\\s?\\blike\\b)"))
[1] "" "ike" "like"
使用这种模式,我错过了 missing 搭配:
unlist(str_extract_all(test_string, "('?\\b[a-z']+\\b|^)(?=\\s?\\blike\\b)"))
[1] "like" "like"
正确的结果应该是这样的:("" 代表字符串开头的“like”的 missing 搭配)
[1] "" "like" "like"
我想知道,这里的错误在哪里?如何改进提取?
【问题讨论】:
-
如果您不关心开头是否出现空匹配,您可以使用
unlist(str_extract_all(test_string, "\\S+(?=\\s+like\\b)|(?<=^like\\b)"))(作为一种解决方法)。 -
让我快速解释一下这个问题:一旦找到空匹配,就会返回空字符串,并且正则表达式索引会前进到字符串中的下一个位置,因此不允许在同一位置进行两个匹配,一个空字符串和从该位置开始的单词。
-
我没有时间这样做,因此您可以尝试的解决方法是匹配并捕获您需要的项目。不过,您将需要重新排序捕获。见
res <- str_match_all(test_string, "(^)(?:\\s*(like)\\b)?|(\\S+)(?=\\s+like\\b)")。如果 Col 4 是NA,则取 Col 2 和 Col 3,否则取 Col 4。 -
which在 Wiktor 的(第一次)工作中返回空字符串位置,并建议第二步likes[c(which(likes == ""), which(likes != ""))],也许。