извлечь подстроку, где символы рядом с ней изменяются с помощью регулярного выражения в r - PullRequest
5 голосов
/ 20 июня 2019

У меня есть несколько строк, как показано ниже. Мне нужно извлечь часть цвета из строк.

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

Я использовал str_replace, как показано ниже. Работает только для s1 и s3. Не для s2 и s4.

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

Кто-нибудь знает, как я могу извлечь цвета из строки, которая работает для всех 4 случаев?

Ответы [ 3 ]

2 голосов
/ 20 июня 2019

Вот моя попытка использовать regmatches вместе со следующим шаблоном регулярных выражений:

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

. Это позволяет отделить первый и второй цвета, причем конец второго цвета задается словами Size илиVerified конца строки.

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 голосов
/ 20 июня 2019

Эти выражения могут работать:

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

и наш код может выглядеть следующим образом:

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

Демонстрация 1

Демонстрация 2

RegEx Circuit

jex.im визуализирует регулярные выражения:

enter image description here

1 голос
/ 20 июня 2019

Это только я или все эти цвета в нижнем регистре? Если это так, вы можете просто сделать:

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

См. демо на regex101.com .

...