R stringr regex提取括号内的字符

R stringr regex to extract characters within brackets

我正在尝试在 R 中使用正则表达式来提取括号内的整个字符串,其中括号包含关键字:

library(stringr)
test <- "asdf asiodjfojewl kjwnkjwnefkjnkf [asdf] fasdfads fewrw [keyword<1] keyword [keyword>1]"

应该return

keyword<1 # fine if it returns [keyword<1] with the brackets too instead
keyword>1

我的尝试return单独输入所有字母并排除括号中的数字。

# my attempt
str_extract_all(test, regex("[\<keyword\>.*?]"))
[[1]]
 [1] "d" "o" "d" "o" "e" "w" "k" "w" "k" "w" "e" "k" "k" "d" "d" "d" "e" "w" "r" "w" "k" "e" "y" "w" "o" "r" "d" "<" "k" "e" "y" "w" "o" "r"
[35] "d" "k" "e" "y" "w" "o" "r" "d" ">"

这将创建字符串 ]...[ 其中 ... 是测试然后将其拆分到 ]...[ 其中 ... 是下一个 [ 之前的最短字符串。在 strsplit 正则表达式中,] 匹配自身,然后 .*?\[ 匹配最短的字符串,直到并包括下一个 [。这 returns 测试的每个组件的一个组件(假设测试可以是一个字符向量),然后 returns 其中包含 < 或 > 的结果。没有使用包。

test |>
  sprintf(fmt = "]%s[") |>
  strsplit("].*?\[") |>
  lapply(grep, pattern = "[<>]", value = TRUE)
## [[1]]
## [1] "keyword<1" "keyword>1"

您可以使用

library(stringr)
test <- "asdf asiodjfojewl kjwnkjwnefkjnkf [asdf] fasdfads fewrw [keyword<1] keyword [keyword>1]"
## If the word is right after "[":
str_extract_all(test, "(?<=\[)keyword[^\]\[]*(?=])")
## If the word is anywhere betwee "[" and "]":
str_extract_all(test, "(?<=\[)[^\]\[]*?keyword[^\]\[]*(?=])")
## =>
# [[1]]
# [1] "keyword<1" "keyword>1"

参见R demo online

正则表达式匹配:

  • (?<=\[) - 正后视要求 [ 字符立即出现在当前位置的左侧
  • keyword - 文字字符串
  • [^\]\[]* - []
  • 以外的零个或多个字符
  • (?=]) - 正前瞻要求 ] 字符立即出现在当前位置的右侧。

参见online regex demo