【问题标题】:R : get string between braces { }R:获取大括号之间的字符串 { }
【发布时间】:2023-03-16 05:50:01
【问题描述】:

更新 我需要获取大括号 { } 之间的字符。

例如,

a <- "{a,b}->{v}"

输出: a,bv

【问题讨论】:

  • 您自己尝试过吗?为什么不分享你的努力?
  • 这与 - stackoverflow.com/questions/38559859/… 有关吗?如果是这样,我希望有比尝试从文本中提取更好的东西。 arules 可能有方法可以做到这一点。
  • 是的,我正在查看文档。什么都找不到。

标签: r regex string


【解决方案1】:

您可以使用 stingr's str_extract_all

在下面的表达式中,(?&lt;=\\{) 用于查找左大括号,(?=\\}) 用于检测右大括号,.+? 用于提取中间的文本。因此,最终表达式将变为(?&lt;=\\{).+?(?=\\})

这将返回一个list()

str_extract_all(a, "(?<=\\{).+?(?=\\})")[[1]]

请按照我执行的另一个示例:

> a <- "{a,b}->{v}{d}{c}{67}"
> str_extract_all(a, "(?<=\\{).+?(?=\\})")[[1]]
[1] "a,b" "v"   "d"   "c"   "67" 

【讨论】:

    【解决方案2】:

    如果你需要匹配大括号之间的字符串不包括大括号,你可以使用

    a <- "{a,b}->{v}"
    stringr::str_extract_all(a, "(?<=\\{)[^{}]+(?=\\})")           # With stringr library
    # => [1] "a,b" "v"
    regmatches(a, gregexpr("(?<=\\{)[^{}]+(?=\\})", a, perl=TRUE)) # Base R approach #1
    # => [1] "a,b" "v"
    regmatches(a, gregexpr("\\{\\K[^{}]+(?=\\})", a, perl=TRUE))   # Base R approach #2
    # => [1] "a,b" "v"
    

    请参阅regex #1 demo。详情:

    • (?&lt;=\{) - 一个positive lookbehind,需要在当前位置左侧紧邻{
    • [^{}]+ - 除了{} 之外的1 个或更多(由于+ quantifier)字符([^...] 是TRE 正则表达式中的否定括号表达式,由基本 R 正则表达式函数中的默认值(或 NFA 正则表达式中的 negated character class,如 stringr 包中的 ICU 正则表达式中使用的那样)
    • (?=\}) - 一个positive lookahead,需要在当前位置左侧紧邻}
    • \{\K 表示匹配和消费{ 后,匹配的文本从匹配值中被丢弃,因此{ 不会出现在结果中。有关详细信息,请参阅Keep The Text Matched So Far out of The Overall Regex Match

    要匹配非嵌套花括号内的字符串包括花括号,您可以使用

    a <- "{a,b}->{v}"
    stringr::str_extract_all(a, "\\{[^{}]*\\}")  # With stringr library
    regmatches(a, gregexpr("\\{[^{}]*}", a))     # Base R approach
    # => [1] "{a,b}" "{v}" 
    

    regex

    这里,\{[^{}]*\} 匹配所有以{ 开头的子字符串,然后是除{} 之外的0+ 个字符(与[^{}]*),然后以} 结尾。

    请参阅R demo online

    【讨论】:

      【解决方案3】:

      抱歉,我正在回答我自己的问题,但是

      j <- "{a,b}->{v}"
      unlist(strsplit(j, split="[{}]"))
      

      显然对于大括号和方括号,我们必须把它放在[]里面

      【讨论】:

      • 如果您不需要知道每个括号集中的内容,您的解决方案就可以了。如果要保留信息,可以使用 grep 和占位符。正则表达式可能很棘手,但值得花时间。您也可以拆分 -> 如果它始终存在并删除括号之前和之后的所有内容
      • Regex 一直是“当我需要黑匣子的时候”,我意识到学好它会是一个救命稻草。至于这个问题,我可以进一步拆分每个 { } 拆分与 "," 拆分以获取各个项目。谢谢。
      【解决方案4】:

      下面是代码

      var a = "{a,b} xyz {v}";
      a = a.split(" ");
      a[0] //outupt {a,b}
      a[2]  //output {v}
      

      【讨论】:

      • 抱歉,我的问题有点不清楚。我会更新的。
      • 我看到你使用了空间。问题是在某些情况下可能没有空间,我需要在大括号之间提取。
      【解决方案5】:

      这是我的解决方案

      library(stringr)
      
      a <- "{a,b}->{v}"
      
      betw_curly <- function(a) { 
        str_sub(a, 
           str_locate_all(a, '\\{')[[1]][,1]+1, 
           str_locate_all(a, '\\}')[[1]][,1]-1)
      }
      
      betw_curly(a)
      

      [1] "a,b" "v"

      【讨论】:

      • 可能不如@Rishabh Ojha 的解决方案那么优雅,但它确实有效。事实上,我试图构建这样的正则表达式,但失败了:-(
      【解决方案6】:

      tools::delimMatch() 函数就是为此目的而设计的。

      tx <- '\\caption{Groups are \\code{ctl} and \\code{trt}}.\label{fig:gps}'
      tools::delimMatch(tx, delim = c("{", "}"))
      ## [1] 9
      ## attr(,"match.length")
      ## [1] 38
      substring(tx,9,9+38-1)
      ## "{Groups are \\code{ctl} and \\code{trt}}"
      

      请注意,未捕获第二个匹配项 ({fig:gps})。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-04
        • 1970-01-01
        • 2016-03-24
        • 2016-08-30
        • 2012-07-15
        • 1970-01-01
        • 2011-07-17
        • 1970-01-01
        相关资源
        最近更新 更多