提取单词的现有和缺失的左侧搭配
Posted
技术标签:
【中文标题】提取单词的现有和缺失的左侧搭配【英文标题】:Extract existing and missing left-hand collocates of a word 【发布时间】: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 != ""))]
,也许。
【参考方案1】:
您可以使用替换 |
来获取字符串开头的位置,并使用带有有限量词的后向断言进行匹配:
^
字符串开始(这是位置)
(?=like\b)
正向前瞻,断言like
后跟直接向右的单词边界
|
或者
(?<=
正面回望
^
字符串开始
(?:like\s1,2)0,100
重复使用有限量词匹配,如后跟空白字符(也后跟有限量词)
)
近距离观察
like\b
匹配like和一个词的边界
Regex demo | R demo
例子
test_string = c("like like like lucy she likes it and she's always liked it.")
library(stringr)
unlist(str_extract_all(test_string, "^(?=like\\b)|(?<=^(?:like\\s1,2)0,100)like\\b"))
输出
[1] "" "like" "like"
【讨论】:
以上是关于提取单词的现有和缺失的左侧搭配的主要内容,如果未能解决你的问题,请参考以下文章