【问题标题】:How to extract number within but excluding brackets with str_extract() from package stringr?如何从包 stringr 中使用 str_extract() 提取括号内但不包括括号内的数字?
【发布时间】:2021-03-02 15:08:12
【问题描述】:

那里有很多正则表达式问题,但我无法以优雅的方式解决以下问题。

我有以下向量,想只提取方括号内的数字,即不包括方括号本身。数字可能是负数。问题也可能是:

如何从{stringr}包中只提取first capturing group函数str_extract

string <- c("[1] cate 1", "[-1] cate -1", "[2] cate 2")
stringr::str_extract(string = string, pattern =  "\\[[^:digit:]+\\]")

[1] "[1]"  "[-1]" "[2]" 

stringr::str_extract(string = string, pattern =  "\\[[^(:digit:)]+\\]")

[1] "[1]"  "[-1]" "[2]" 

我还尝试将\\1 附加到模式以提取第一组并得到以下错误:

stringr::str_extract(string = string, pattern =  "\\[[^(?:digit:)]+\\]\\1")

Error in stri_extract_first_regex(string, pattern, opts_regex = opts(pattern)) : 
  Back-reference to a non-existent capture group. (U_REGEX_INVALID_BACK_REF)

感谢您抽出宝贵时间,如果此问题重复,我们深表歉意。

【问题讨论】:

  • stringr::str_extract(string, "(?&lt;=\\[)-?\\d+(?=\\])"),见ideone.com/DJyBRM
  • 太棒了!这可以完成工作。谢谢! (你想把它写成答案,这样我就可以结束这个问题了吗?)

标签: r regex stringr


【解决方案1】:

你可以使用

stringr::str_extract(string, "(?<=\\[)-?\\d+(?=\\])")

R demo

如果需要匹配整数或浮点数,可以使用

stringr::str_extract(string, "(?<=\\[)-?\\d*\\.?\\d+(?=\\])")

详情

  • (?&lt;=\[) - 一个正向的后视,匹配紧接在 [ 之前的位置
  • -? - 一个可选的 - 字符
  • \d+ - 一位或多位数字
  • \d*\.?\d+ - 匹配零个或多个数字,可选的.,然后是一个或多个数字
  • (?=\]) - 与紧跟在] 之后的位置匹配的正向前瞻。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-18
    • 2021-10-17
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    相关资源
    最近更新 更多