从右到左从第一个方括号中提取字符串

时间:2019-05-21 09:51:36

标签: r regex

我正在尝试仅从右到左开始的第一个方括号中提取字符串

我尝试使用str_matchregexpr的多种方法,但我做不到。

c<-"Sens [91] [DRCol105]_Issuer[Risk\\Issuer]"

str_match(c,"\\[.*?\\]$")

OR

start.char<-regexpr("\\[*$",c)[1]+2
stop.char<-regexpr("\\]*$",c)[1]-1
substr(c,start.char,stop.char)

我想提取最后一个方括号内的所有内容。在此示例中,我只想提取“ Risk \ Issuer”并将其保存在变量中。

4 个答案:

答案 0 :(得分:3)

这是使用正则表达式的另一种解决方案

# s <- "Sens [91] [DRCol105]_Issuer[Risk\\Issuer]"

gsub('.*\\[(.*)\\]', '\\1', s, perl = TRUE)
# [1] "Risk\\Issuer"

正则表达式.*\\[(.*)\\])提取 last 方括号内的字符串。

# s <- c("Sens [91] [DRCol105]_Issuer[Risk\\Issuer]", "123 [91]@[test] something follows")

gsub('.*\\[(.*)\\][^\\[]*', '\\1', s, perl = TRUE)
# [1] "Risk\\Issuer" "test"

如果字符串不以方括号结尾,则具有工作优势。

答案 1 :(得分:2)

我已将字符串名称更改为s,因为c是基本的R函数名称。

s <- "Sens [91] [DRCol105]_Issuer[Risk\\Issuer]"

sub("^.*(\\[.*?\\]$)", "\\1", s)
#[1] "[Risk\\Issuer]"

或者,如果要删除括号:

sub("^.*\\[(.*?)\\]$", "\\1", s)
#[1] "Risk\\Issuer"

答案 2 :(得分:2)

以下是几种选择:

tail(stringr::str_match_all(s, "\\[(.*?)\\]")[[1]][, 2], 1)
#[1] "Risk\\Issuer"

使用相同的正则表达式

stringi::stri_extract_last_regex(s, "\\[(.*?)\\]")
#[1] "[Risk\\Issuer]"

或者删除括号

gsub("\\[|\\]", "", stringi::stri_extract_last_regex(s, "\\[(.*?)\\]"))
#[1] "Risk\\Issuer"

答案 3 :(得分:1)

这是一种strsplit方法,

tail(strsplit(x, '[', fixed = TRUE)[[1]], 1)
[1] "Risk\\Issuer]"

#or If you don't want the last bracket,

sub(']', '', tail(strsplit(x, '[', fixed = TRUE)[[1]], 1))
[1] "Risk\\Issuer"