在R中的两个特定单词之间提取一串单词

时间:2015-02-01 20:19:33

标签: regex r

我有以下字符串:"PRODUCT colgate good but not goodOKAY"

我想提取PRODUCTOKAY

之间的所有字词

5 个答案:

答案 0 :(得分:24)

可以使用sub

完成此操作
s <- "PRODUCT colgate good but not goodOKAY"
sub(".*PRODUCT *(.*?) *OKAY.*", "\\1", s)

,并提供:

[1] "colgate good but not good"

不需要包裹。

以下是正则表达式的可视化:

.*PRODUCT *(.*?) *OKAY.*

Regular expression visualization

Debuggex Demo

答案 1 :(得分:15)

您可以使用gsub

vec <- "PRODUCT colgate good but not goodOKAY"

gsub(".*PRODUCT\\s*|OKAY.*", "", vec)
# [1] "colgate good but not good"

答案 2 :(得分:14)

x = "PRODUCT colgate good but not goodOKAY"
library(stringr)
str_extract(string = x, pattern = perl("(?<=PRODUCT).*(?=OKAY)"))

(?<=PRODUCT) - 查看PRODUCT

的匹配背后

.*匹配除新行之外的所有内容。

(?=OKAY) - 展望未来匹配OKAY

我应该补充一下,不需要stingr包,基本函数subgsub可以正常工作。我使用stringr来保证语法的一致性:无论是提取,替换,检测等,函数名称都是可预测和可理解的,并且参数的顺序是一致的。我使用stringr因为它每次都不需要文档。

答案 3 :(得分:9)

您可以使用 qdapRegex 包中的rm_between功能。它需要一个字符串和一个左右边界如下:

x <- "PRODUCT colgate good but not goodOKAY"

library(qdapRegex)
rm_between(x, "PRODUCT", "OKAY", extract=TRUE)

## [[1]]
## [1] "colgate good but not good"

答案 4 :(得分:1)

您可以使用软件包 unglue

library(unglue)
x <- "PRODUCT colgate good but not goodOKAY"
unglue_vec(x, "PRODUCT {out}OKAY")
#> [1] "colgate good but not good"