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, "(?<=\\[)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。
正则表达式匹配:
(?<=\[)
- 一个积极的向后看,需要 [
字符立即出现在当前位置的左侧
keyword
- 文字字符串
[^\]\[]*
- 除了[
和]
之外的零个或多个字符
(?=])
- 正向前瞻,需要 ]
字符立即出现在当前位置的右侧。
请参阅online regex demo。
【讨论】:
以上是关于R stringr 正则表达式提取括号内的字符的主要内容,如果未能解决你的问题,请参考以下文章