Karl Broman 的帖子:https ://kbroman.wordpress.com/2015/06/22/randomized-hobbit-2/让我玩正则表达式和 ngram 只是为了好玩。我尝试使用正则表达式来提取 2-grams。我知道有解析器可以做到这一点,但我对正则表达式逻辑感兴趣(即,这是我未能满足的自我挑战)。
下面我给出一个最小的例子和所需的输出。我尝试的问题是2倍:
克(单词)被吃掉了,不能用于下一次传递。 如何使它们可用于第二次通行证?(例如,我希望
like
在like toast
之前已经使用过之后可以使用I like
)我无法使单词之间的空格未被捕获(请注意输出中的尾随空格,即使我使用了
(?:\\s*)
)。 如何不捕获第 n 个(在本例中为第二个)单词的尾随空格?我知道这可以简单地完成:"(\\b[A-Za-z']+\\s)(\\b[A-Za-z']+)"
对于 2-gram,但我想将解决方案扩展到 n-gram。PS我知道,\\w
但我不认为下划线和数字是单词的一部分,而是考虑'
作为单词的一部分。
MWE:
library(stringi)
x <- "I like toast and jam."
stringi::stri_extract_all_regex(
x,
pattern = "((\\b[A-Za-z']+\\b)(?:\\s*)){2}"
)
## [[1]]
## [1] "I like " "toast and "
期望的输出:
## [[1]]
## [1] "I like" "like toast" "toast and" "and jam"