【问题标题】:Extract last regex match in R [duplicate]提取R中的最后一个正则表达式匹配[重复]
【发布时间】:2020-07-08 08:51:08
【问题描述】:

我使用mutate()str_extract() 将数据框中的字符串列压缩为单个关键字列。我的问题是其中一个字符串包含两个关键字,而第二个对我来说更重要。但是,正则表达式总是先找到我告诉它寻找的替代方案。有办法改变吗?

MWE(没有mutate()):

teststring <- "abcdef"
str_extract(teststring, "b|c|a")

我希望能够按照我选择的顺序查找模式,而不是测试字符串中的第一个。

【问题讨论】:

  • 可能是lapply(c("b","c","a"), stringr::str_extract, string=teststring)?
  • @WiktorStribiżew 第一个版本运行良好,谢谢!
  • 我无法使用“R 中的最后匹配正则表达式”找到任何重复项,因此即使它是重复项,它也会成为未来访问者的一个很好的路标。
  • 我什至不认为这是在寻找最后一场比赛。幸运的是,这就是问题所在,而不是我试图在中间找到一些东西。

标签: r regex


【解决方案1】:

您可以使用stringi::stri_extract_laststringi::stri_extract_last_regex 来获得最后一场比赛:

stringi::stri_extract_last_regex('zzzayyyyc.', '[abc]')
stringi::stri_extract_last('zzzayyyyc.', regex=c('[abc]'))

查看R demo online,两者都返回[1] "c"

【讨论】:

    【解决方案2】:

    基于 Gki 在评论中的回答,如果您只想返回所选订单的第一个匹配项。我们可以用以下代码包装代码:

    teststring <- "ccccbbbaaaaqwerty"
    
    which.min(is.na((sapply(c("b","c","a"), stringr::str_extract, string=teststring))))
    
    b 
    1
    

    【讨论】:

    • 谢谢!不过,将它与 mutate() 一起使用只会给我返回索引号。
    • 我不是dplyr 专家,但是如果您使用names(...) 包装代码,您将只得到模式。也许你可以实现这个?
    • 好点,我原以为它会起作用,但它没有给我任何东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-11
    • 1970-01-01
    • 2016-01-01
    • 1970-01-01
    相关资源
    最近更新 更多