【问题标题】:R str_extract everything before and after ellipsisR str_extract 省略号前后的所有内容
【发布时间】:2021-12-08 14:35:45
【问题描述】:

我正在尝试找到一种方法将中间带有省略号的字符列分成两列,省略号之前的所有内容和之后的所有内容。

例如,如果我有:

a <- "60.4 (b)(33) and (e)(1) revised....................................46111"

如何将其拆分为“60.4 (b)(33) 和 (e)(1) 修订版”和“46111”?

我试过了:

str_extract(a, ".*\\.{2,}")

第一部分,第二部分:

str_extract(a, "\\.{2,}.*")

但这两个都保留了省略号,我想删除它。

【问题讨论】:

    标签: r regex stringr


    【解决方案1】:

    您似乎想拆分,而不是提取,使用匹配两个或多个连续点的模式:

    a <- "60.4 (b)(33) and (e)(1) revised....................................46111"
    unlist(stringr::str_split(a, "\\.{2,}"))
    ## => [1] "60.4 (b)(33) and (e)(1) revised" "46111"                          
    
    ## Base R strsplit:
    unlist(strsplit(a, "\\.{2,}"))
    ## => [1] "60.4 (b)(33) and (e)(1) revised" "46111"
    

    这里还有另一种可能的拆分正则表达式:您可以匹配任何一个或多个点,其后跟在字符串末尾的一个或多个数字:

    unlist(stringr::str_split(a, "\\.+(?=\\d+$)"))
    unlist(strsplit(a, "\\.+(?=\\d+$)", perl=TRUE))
    

    两者都产生相同的[1] "60.4 (b)(33) and (e)(1) revised" "46111" 输出。这里,\.+ 匹配一个或多个点,(?=\d+$) 是一个正向前瞻,它匹配紧随其后是一个或多个数字 (\d+) 和字符串结尾 ($) 的位置。

    另一种方法是匹配 str_match(捕获您需要的位):

    res <- stringr::str_match(a, "^(.*?)\\.+(\\d+)$")
    res[,-1]
    # => [1] "60.4 (b)(33) and (e)(1) revised" "46111" 
    

    这里,

    • ^ - 匹配字符串的开头
    • (.*?) - 第 1 组:除换行符之外的任何零个或多个字符,尽可能少
    • \.+ - 一个或多个点
    • (\d+) - 第 2 组:一位或多位数字
    • $ - 字符串结束。

    res[,-1] 是删除包含完整匹配项的第一列所必需的。

    【讨论】:

      猜你喜欢
      • 2021-05-24
      • 1970-01-01
      • 1970-01-01
      • 2019-06-28
      • 2020-05-20
      • 2015-04-03
      • 2017-09-02
      • 1970-01-01
      • 2014-12-20
      相关资源
      最近更新 更多