R stringr 正则表达式提取括号内的字符

Posted

技术标签:

【中文标题】R stringr 正则表达式提取括号内的字符【英文标题】:R stringr regex to extract characters within brackets 【发布时间】:2022-01-17 04:40:30 【问题描述】:

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

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

应该返回

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

我的尝试单独返回所有字母并排除括号中的数字。

# 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" ">"

【问题讨论】:

你可以试试:str_extract_all(test, "(?&lt;=\\[)keyword.*?(?=\\])") 行得通!你能把它作为答案提交给我吗? drj3122,不要急于选择答案。似乎对您有用的答案稍后可能会被证明是不正确的,或者可能会出现更好的答案。这里的许多提问者至少要等几个小时才能做出选择。有些等待的时间要长一些。 @AndS,与'[keywording]' 中的'keywording' 匹配,但与'[no keyword]' 中的'keyword' 不匹配。请注意,虽然示例中的关键字紧跟在左括号之后,但第一句表明情况并非总是如此。 @CarySwoveland 我只写了一个简短的评论来回答提出的问题。示例中没有“关键字”和“无关键字”,因此我没有尝试将它们考虑在内。 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

你可以使用

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。

正则表达式匹配:

(?&lt;=\[) - 一个积极的向后看,需要 [ 字符立即出现在当前位置的左侧 keyword - 文字字符串 [^\]\[]* - 除了[] 之外的零个或多个字符 (?=]) - 正向前瞻,需要 ] 字符立即出现在当前位置的右侧。

请参阅online regex demo。

【讨论】:

以上是关于R stringr 正则表达式提取括号内的字符的主要内容,如果未能解决你的问题,请参考以下文章

正则表达式提取括号内的所有内容

使用正则表达式提取字符串 - str_extract、stringr、regex

正则表达式查找字符串中大括号内的任何标签

c#用正则表达式提取小括号中的内容

正则表达式提取方括号或大括号之间的文本

R语言学习14-stringr包