我正在尝试在字符串(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
如何简化/美化上面的正则表达式?
答案 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
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