首页 > 解决方案 > 仅提取字符串中最后一个数字后的空格后的字符

问题描述

我不太擅长使用正则表达式。我有一个字符串向量。我想在最后一个数字后面的空格之后提取所有内容。我已经检查了各种其他 SO 帖子,但我尝试过的所有内容都会破坏字符串。

我试过直接提取我想要的文本以及提取我不想要的文本。我两方面都失败了。

这是一个示例向量:

c("54 ABC, efg xyz", "ABC 08 abcdef ghijkl", "ABC 01-02 ghijkl")

这是所需的输出

c("ABC, efg xyz", "abcdef ghijkl", "ghijkl")

这是我尝试过的:

library(dplyr)
library(stringr)

c("54 ABC, efg xyz", "ABC 08 abcdef ghijkl", "ABC 01-02 ghijkl") %>% 
  str_replace("[^[:digit:]] +", "")
[1] "54 ABCefg xyz"      "AB08 abcdef ghijkl" "AB01-02 ghijkl"

我试着把它分成几个步骤:

c("54 ABC, efg xyz", "ABC 08 abcdef ghijkl", "ABC 01-02 ghijkl") %>% 
    str_replace_all("^[:digit:]+\\s", "") %>% 
    str_replace_all("ABC ", "") %>% 
    str_replace_all("^[:digit:]+\\s", "") %>% 
    str_replace_all(".*? ", "")
[1] "xyz"    "ghijkl" "ghijkl"

还有其他一些尝试,但不值得发布。

我相信在我花了几个小时无处可去之后,有人能够轻松解决这个问题。

标签: rregex

解决方案


我们可以使用它sub来执行此操作,即匹配字符 ( .*) 直到一个或多个数字 ( \\d+) 后跟一个或多个空格 ( \\s+) 并替换为空白 ( "")

sub(".*\\d+\\s+", "", v1)

-输出

[1] "ABC, efg xyz"  "abcdef ghijkl" "ghijkl"   

或使用str_remove

library(stringr)
str_remove(v1, ".*\\d+\\s+")
[1] "ABC, efg xyz"  "abcdef ghijkl" "ghijkl"  

数据

v1 <- c("54 ABC, efg xyz", "ABC 08 abcdef ghijkl", "ABC 01-02 ghijkl")

推荐阅读