【问题标题】:R stringr regex to extract characters within bracketsR stringr 正则表达式提取括号内的字符
【发布时间】: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 我只写了一个简短的评论来回答提出的问题。示例中没有“关键字”和“无关键字”,因此我没有尝试将它们考虑在内。

标签: r regex stringr


【解决方案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

    【讨论】:

      猜你喜欢
      • 2021-11-20
      • 1970-01-01
      • 2022-01-18
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-08-11
      • 1970-01-01
      相关资源
      最近更新 更多