【发布时间】:2017-10-13 18:15:24
【问题描述】:
我有一个非常混乱的字符串向量。这是一个例子:
library(tidyverse)
library(stringr)
strings <- tibble(
name = c("lorem 11:07:59 86136-1-sed",
"ipsum 14:35:57 S VARNAME-ut",
"dolor 10:37:53 1513 -2-perspiciatis",
"sit 10:48:25",
"amet 13:52:1365293-2-unde",
"consectetur 11:53:1 16018-2-omnis",
"adipiscing 11:19 17237-2-iste"
)
)
strings_out <- strings %>%
mutate(heads = str_extract(name, "^.*?\\s\\d{1,2}:\\d{1,2}:\\d{1,2}")) %>%
mutate(ends = str_replace(name, "^.*?\\s\\d{1,2}:\\d{1,2}:\\d{1,2}", ""))
strings_out[,2:3]
#> # A tibble: 7 x 2
#> heads ends
#> <chr> <chr>
#> 1 lorem 11:07:59 86136-1-sed
#> 2 ipsum 14:35:57 S VARNAME-ut
#> 3 dolor 10:37:53 1513 -2-perspiciatis
#> 4 sit 10:48:25
#> 5 amet 13:52:13 65293-2-unde
#> 6 consectetur 11:53:1 16018-2-omnis
#> 7 <NA> adipiscing 11:19 17237-2-iste
所以这里我有一些字符串,其中包含一些文本,然后是一个可能输入正确也可能不正确输入的时间,然后是更多文本。我想在时间之后仅提取字符串的结尾,但是它们没有任何似乎与使用str_extract 的潜在正则表达式很好对应的模式。我可以轻松匹配字符串的前半部分,如heads 所示。但是,我发现提取后半部分的唯一方法是使用带有空字符串的str_replace,如ends 所示。
我尝试在此列表中包含我注意到的所有常见错误:在时间之后没有关于连字符、间距或字符串内容的模式,在时间和所需的字符串结尾一半之间没有保证空间,缺少时间数字甚至冒号。
我想做的是能够使用str_extract 来获得与str_replace 接近的东西。关键区别在于,对于这个正则表达式仍然不起作用的错误,str_extract 给了我一个易于手动过滤和修复的NA,但str_replace 只是复制整个字符串,如第 7 行所示.
我怀疑我可以用一些更hacky的方法来做到这一点,比如获取所有NA并在Excel中手动修复或其他东西,但我很惊讶我无法弄清楚如何在一般尽管搜索和尝试不同的正则表达式,包括(^) 和[^]。有什么想法吗?
【问题讨论】:
-
想要的结果是什么?
-
很抱歉,如果不清楚。期望的结果是第二列,除了在第一列有一个的地方返回 NA 。我意识到我可以通过并在正确的索引处将它们替换为
NA,但我发现“返回字符串的不匹配部分”的概念似乎很难做到。