R中具有环顾的Regexpr

时间:2018-09-26 14:45:00

标签: r regex

我正在尝试在字符串(255; 0; 0)中获取bgcol的

我没有设法弄清楚R中的前瞻,这对于完成此任务很有用,因此我不得不将regexpr+regmatches与2个后续的gsub调用组合在一起。

string <- "<params description=\"some desc\" bgcol=\"248;186;203\" col=\"0;200;0\"/>"
string <- "<params description=\"some desc\" bgcol=\"255;0;0\"/>"


bgcol = regmatches(string, regexpr('(bgcol=\"(.*)\")', string, perl=TRUE))
bgcol = gsub(pattern = "\"", replacement="", bgcol)
bgcol = gsub(pattern = "bgcol=", replacement="", bgcol)

as.integer(strsplit(bgcol, ";")[[1]])
  

[1] 255 0 0

如何简化/美化上面的正则表达式?

4 个答案:

答案 0 :(得分:2)

您可以使用此模式'.*bgcol=\"(\\d*;\\d*;\\d*)\"\\s?.*'

> bgcol <- gsub('.*bgcol=\"(\\d*;\\d*;\\d*)\"\\s?.*', "\\1", strings)
> lapply(strsplit(bgcol, ";"), as.integer)
[[1]]
[1] 255   0   0

[[2]]
[1] 248 186 203

答案 1 :(得分:2)

您可以使用regmatches / regexec

string <- "<params description=\"some desc\" bgcol=\"255;0;0\"/>"
lapply(strsplit(regmatches(string, regexec('bgcol="([^"]*)"', string))[[1]][2], ";"), as.integer)
## => [[1]]
##    [1] 255   0   0

bgcol="([^"]*)"模式匹配bgcol=",然后匹配并将"以外的任何0+字符捕获并捕获到组1中(regexec跟踪所有捕获的子字符串),并且然后匹配"

或带有regmatches / regexpr的PCRE模式:

lapply(strsplit(regmatches(string, regexpr('bgcol="\\K[^"]*', string, perl=TRUE)), ";"), as.integer)
## => [[1]]
##    [1] 255   0   0

请参见online R demo

bgcol="\\K[^"]*模式匹配bgcol=",然后在\K match reset运算符的帮助下将此文本从匹配中删除,仅保留与[^"]*匹配的文本在比赛中。

仅出于完整性考虑,stringr解决方案:

> library(stringr)
> lapply(strsplit(str_extract(string, '(?<=bgcol=")[^"]*'), ";"), as.integer)
[[1]]
[1] 255   0   0

> lapply(strsplit(str_match(string, 'bgcol="([^"]*)"')[,2], ";"), as.integer)
[[1]]
[1] 255   0   0

请注意,(?<=bgcol=")函数中的str_extract仅检查当前位置左侧的bgcol=",因此它不是匹配项。

答案 2 :(得分:0)

您可以使用read.table

read.table(text = gsub('.*bgcol.*?(\\d+;\\d+;\\d+).*', '\\1', string), sep=';')
   V1  V2  V3
1 248 186 203
2 255   0   0

答案 3 :(得分:0)

如果您的数据位于一个漂亮的小数据框中,例如:

df <- tibble(string <- c("<params description=\"some desc\" bgcol=\"248;186;203\" col=\"0;200;0\"/>",
            "<params description=\"some desc\" bgcol=\"255;0;0\"/>"))

那你就可以做到

  df %>% mutate(bgcol.value = str_extract(string, "\\d+;\\d+;\\d+")) 

# A tibble: 2 x 2
  `string <- c("<params description=\\"some desc\\" bgcol=\\"248;186;203\\" … bgcol.value
  <chr>                                                                       <chr>      
1 "<params description=\"some desc\" bgcol=\"248;186;203\" col=\"0;200;0\"/>" 248;186;203
2 "<params description=\"some desc\" bgcol=\"255;0;0\"/>"                     248;186;203