从字符串中提取时钟时间
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"
正则表达式由两部分组成,它们与逻辑 或 (|
).
.+?(?=[0-9]+:[0-9]+)
此正则表达式匹配后跟目标模式的正数字符。
.+
这个正则表达式匹配正数个字符。
逻辑:将目标模式之前的所有内容替换为空字符串 (''
)。如果没有目标模式,则将所有内容替换为空字符串。
我有一个由网络抓取的数据组成的数据框。抓取的字段之一是时钟时间,但抓取过程并不完美。大多数 '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"
正则表达式由两部分组成,它们与逻辑 或 (|
).
.+?(?=[0-9]+:[0-9]+)
此正则表达式匹配后跟目标模式的正数字符。.+
这个正则表达式匹配正数个字符。
逻辑:将目标模式之前的所有内容替换为空字符串 (''
)。如果没有目标模式,则将所有内容替换为空字符串。