【问题标题】:R tidyr extract doesn't capture multiline expressionsR tidyr extract 不捕获多行表达式
【发布时间】:2019-09-18 01:52:42
【问题描述】:

我有一个带有多行字符串的 tibble,我想使用 tidyr::extract 使用正则表达式组提取变量,其中值是多行字符串。但是,在以下示例中,我没有提取 - 分隔的组。

library(tidyverse)

df <- tibble(x = "12\n34-56\n78-90\n12")

my_regex <- regex("(.*)-(.*)-(.*)", multiline = TRUE, dotall = TRUE)

extract(df, x, c("y", "z", "a"), my_regex)
#> # A tibble: 1 x 3
#>   y     z     a    
#>   <chr> <chr> <chr>
#> 1 <NA>  <NA>  <NA>

正则表达式本身没有问题,如 stringr::str_view 所示。

str_view(df$x, my_regex)

这是 tidyr::extract 的已知错误或功能吗?(请注意,我的实际问题更复杂,不适用于 tidyr::separate 像这样。)

【问题讨论】:

    标签: r tidyr


    【解决方案1】:

    tidyr 只是不支持 stringr::regex 的输出 这不是错误,请参阅:https://github.com/tidyverse/tidyr/issues/749https://github.com/tidyverse/tidyr/issues/693

    你可以这样做:

    library(tidyverse)
    
    df <- tibble(x = "12\n34-56\n78-90\n12")
    extract(df, x, c("y", "z", "a"), regex = "(?s)(.*)-(.*)-(.*)")
    #> # A tibble: 1 x 3
    #>   y        z        a       
    #>   <chr>    <chr>    <chr>   
    #> 1 "12\n34" "56\n78" "90\n12"
    

    reprex package (v0.3.0) 于 2019 年 9 月 18 日创建

    【讨论】:

    • 太好了,谢谢。对于那些想知道的人,正则表达式开头的(?s) 确保. 匹配换行符(\n),而无需使用dotall = TRUE。请参阅stackoverflow.com/questions/10927930/meaning-of-s-in-regex 了解更多信息。
    • tidyr 只是不支持 stringr::regex 的输出似乎不正确。不是 tidyr 不支持输出,而是 . 不匹配换行符,您必须将正则表达式置于单行模式,即 (?s) 而不是默认的多行模式
    • 如果 tidyr 确实支持该输出,选项 dotall = TRUE 不会处理吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 2010-10-31
    • 2013-06-12
    相关资源
    最近更新 更多