【问题标题】:R regmatches regexpr want to exclude delimiterR regmatches regexpr 想要排除分隔符
【发布时间】:2020-10-06 02:24:49
【问题描述】:

我想提取字符向量的两个下划线之间的文本,例如:

text <- c("one_two_three", "a_b_c", "do_re_mi", "you_and_me", "not_this")

目标是获取每个字符串中间部分的向量,如下所示:

[1] "two" "b" "re" "and"

我尝试使用正则表达式,但结果中仍然存在下划线,这是我不想要的。

regmatches(text, regexpr('_(.*?)_', text))
[1] "_two_" "_b_"   "_re_"  "_and_"

如果有更好的(非正则表达式)方法来解决这个问题或纠正正则表达式,请告诉我。谢谢!

【问题讨论】:

    标签: r regex string


    【解决方案1】:

    您可以在stringr::str_match 中使用您的正则表达式模式:

    stringr::str_match(text, '_(.*?)_')[, 2]
    #[1] "two" "b"   "re"  "and" NA  
    

    [, 2]部分是提取捕获组。

    【讨论】:

      【解决方案2】:

      一种方法是使用"lookaround",一个 perl 正则表达式扩展:

      regmatches(text, regexpr('(?<=_)([^_]+)(?=_)', text, perl = TRUE))
      # [1] "two" "b"   "re"  "and"
      

      我还将内部模式更改为更具体一点:[^_]+ 一个或多个非_ 字符。 (?&lt;=_) 表示 “前面有 _ 但不包含在返回/消费模式中”(?=_) 表示 “后跟 _ 但不包含在返回/消费模式”。使用任何一个都需要perl=TRUE,否则你会得到一个错误。 (R 中的大多数正则表达式函数都可以使用 Lookaround。我会说“全部”,但我并不完全了解它们......所以我现在会说很多或大部分 :-)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多