从字符串中提取时钟时间

Extracting clock time from string

我有一个由网络抓取的数据组成的数据框。抓取的字段之一是时钟时间,但抓取过程并不完美。大多数 'good' 数据看起来像 '4:33'103:20(因此前导单引号和两个字段,分钟和秒)。此外,还有一些错误数据,最常见的是 '],,但也有一些包含文本。我想要一个类似于 4:33 的新字符串,对于错误数据,只是空白。

所以我的攻击计划是匹配我好的数据形式,然后用空白替换其他所有内容space。有时像 time <- gsub('[0-9]+:[0-9]+', '', time)。我知道这会用空白替换我的模式,我想要相反的结果,但我不确定如何否定整个模式。一个简单的克拉似乎不起作用,也不适用于一个组。我尝试了 gsub("(.)+([0-9]+)(:)([0-9]+)", "\2\3\4", time) 之类的方法,但这也不起作用。

样本:

dput(sample)
c("'], ", "' Ling (2-0)vsThe Dragon(2-0)", "'8:18", "'13:33", 
"'43:33")

预期输出:

c("", "", "8:18", "13:33", "43:33")

我们可以使用grep将不符合模式的元素替换为'',然后将引号(')替换为''。在这里,模式是字符串以 ' 开头 (^),后跟数字 :,数字按此顺序一直到字符串的结尾 ($)。因此,使用来自 grepl 的逻辑索引将所有其他字符串元素(通过取反,即 !)分配给 '',我们使用 sub 替换 ' .

 sample[!grepl("^'\d+:\d+$", sample)] <- ''
 sub("'", '', sample)
 #[1] ""      ""      "8:18"  "13:33" "43:33"

或者我们也可以使用 gsub 将所有不遵循模式 \d+:\d+ 的字符 (.) 替换为 '',一步完成。

 gsub("(\d+:\d+)(*SKIP)(*F)|.", '', sample, perl=TRUE)
 #[1] ""      ""      "8:18"  "13:33" "43:33"

或者另一个选项是 str_extract 来自 library(stringr)。目前尚不清楚 OP 的原始数据集中是否存在其他模式,例如 "some text '08:20 value"str_extract 还将提取这些时间值(如果存在)。

library(stringr)
str_extract(sample, '\d+:\d+')
#[1] NA      NA      "8:18"  "13:33" "43:33"

对于那些不遵循该模式的人,它将给出 NA 而不是 ''

您可以使用 sub:

sub('.+?(?=[0-9]+:[0-9]+)|.+', '', sample, perl = TRUE)
[1] ""      ""      "8:18"  "13:33" "43:33"

正则表达式由两部分组成,它们与逻辑 (|).

  1. .+?(?=[0-9]+:[0-9]+) 此正则表达式匹配后跟目标模式的正数字符。

  2. .+ 这个正则表达式匹配正数个字符。

逻辑:将目标模式之前的所有内容替换为空字符串 ('')。如果没有目标模式,则将所有内容替换为空字符串。