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"
正则表达式匹配:
(?<=\[)
- 正后视要求 [
字符立即出现在当前位置的左侧
keyword
- 文字字符串
[^\]\[]*
- [
和 ]
以外的零个或多个字符
(?=])
- 正前瞻要求 ]
字符立即出现在当前位置的右侧。
我正在尝试在 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"
正则表达式匹配:
(?<=\[)
- 正后视要求[
字符立即出现在当前位置的左侧keyword
- 文字字符串[^\]\[]*
-[
和]
以外的零个或多个字符
(?=])
- 正前瞻要求]
字符立即出现在当前位置的右侧。