【问题标题】:Match numbers or first letter before a character - regex [closed]匹配字符前的数字或第一个字母 - 正则表达式 [关闭]
【发布时间】:2021-06-18 18:54:08
【问题描述】:

我正在尝试在 R 中匹配特定模式以分隔成列

考虑以下字符串示例:

1-EXAMPLE
23-EXAMPLE2
A-EXAMPLE3
EXAMPLE-4

我怎样才能写一个正则表达式用于tidyr::extract,以便分离发生如下:

1   EXAMPLE
23  EXAMPLE2
A   EXAMPLE3
NA  EXAMPLE-4

我想在第一个 - 标记之前进行分隔,如果在它之前只有数字,或者如果事先有一个字母(如第三种情况),但如果有更多(如示例 4 )

谢谢!

【问题讨论】:

    标签: r regex tidyr


    【解决方案1】:

    我们可以在extract之前使用case_when插入一个字符

    library(dplyr)
    library(stringr)
    library(tidyr)
    df1 %>% 
        mutate(col1 = case_when(str_detect(trimws(col1), '^([A-Z]|[0-9]+)\\s*-', 
           negate = TRUE) ~ str_c('-', col1), TRUE ~ trimws(col1))) %>% 
        extract(col1, into = c('col1', 'col2'), '^([A-Z]|\\d+)?\\s*-(.*)') %>% 
        mutate(col1 = na_if(col1, ''))
    

    -输出

    col1      col2
    1    1   EXAMPLE
    2   23  EXAMPLE2
    3    A  EXAMPLE3
    4 <NA> EXAMPLE-4
    

    数据

    df1 <- structure(list(col1 = c("1-EXAMPLE", "23-EXAMPLE2", "A-EXAMPLE3", 
    "EXAMPLE-4")), class = "data.frame", row.names = c(NA, -4L))
    

    【讨论】:

    • 谢谢!如何在“-”之前添加一些空格的可能性?我试过"([A-Z\\s+]|\\d+\\s+)-(.*)",但没用
    • @ArthurCarvalhoBrito 更新对你有帮助
    • @ArthurCarvalhoBrito 我会先在列上使用trimws 来删除那个空格
    • 但是如何删除“-”之前的空格,而不是字符串开头的空格?
    • @ArthurCarvalhoBrito 你能试试更新吗?我没有测试它,因为没有例子
    猜你喜欢
    • 2020-12-21
    • 1970-01-01
    • 2011-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-01
    相关资源
    最近更新 更多