使用r中的regex提取子字符串,其旁边的字符会发生变化

时间:2019-06-20 04:32:00

标签: r regex stringr

我有一些类似下面的字符串。我需要从字符串中提取颜色部分。

s1=  'color: red greenSize: 2 CountVerified Purchase'
s2=  'color: red greenVerified Purchase'
s3=  'color: red greenSize: 2 Count'
s4=  'color: red green'

我使用了str_replace,如下所示。它仅适用于s1s3。不适用于s2s4

str_replace(s1, 'color:\\s(.*)Size:\\s.*', '\\1')

有人知道我如何从适用于所有4种情况的字符串中提取颜色吗?

3 个答案:

答案 0 :(得分:2)

这些表达式可能有效:

color:\s(.*?)(Size.*|[A-Z].*|$)
color:\s(.*?)([A-Z].*|$)

我们的代码可能看起来像

str_replace(s1, 'color:\\s(.*?)([A-Z].*|$)', '\\1')

Demo 1

Demo 2

RegEx电路

jex.im可视化正则表达式:

enter image description here

答案 1 :(得分:2)

这是我尝试使用regmatches以及以下正则表达式模式:

color: (\\S+) (\\S+)(?=Size|Verified|$)

这将隔离第一和第二种颜色,第二种颜色的结尾由字符串末尾的单词SizeVerified给出。

x <- c("color: red greenSize: 2 CountVerified Purchase",
       "color: red greenVerified Purchase",
       "color: red greenSize: 2 Count",
       "color: red green")
sapply(x, function(x) {
    result <- regmatches(x, regexec("color: (\\S+) (\\S+)(?=Size|Verified|$)", x, perl=TRUE))[[1]]
    c(result[2], result[3])
})

这输出(有点混乱):

     color: red greenSize: 2 CountVerified Purchase
[1,] "red"
[2,] "green"
     color: red greenVerified Purchase color: red greenSize: 2 Count
[1,] "red"                             "red"
[2,] "green"                           "green"
     color: red green
[1,] "red"
[2,] "green"

答案 2 :(得分:1)

是我还是所有这些颜色都是小写的?如果碰巧是这种情况,您可以执行以下操作:

pattern <- "color:\\s*([a-z ]+).*"
gsub(pattern, "\\1", your_strings_here)

请参见a demo on regex101.com