使用gsub在R中的空格之前提取字符串

时间:2013-04-09 06:44:11

标签: r

我有一个生日列表,看起来像这样:

dob <- c("9/9/43 12:00 AM/PM", "9/17/88 12:00 AM/PM", "11/21/48 12:00 AM/PM")

我想从这个变量中获取日历日期(即在第一次出现空格后丢弃所有内容)。

这是我到目前为止所尝试的内容:

dob.abridged <- substring(dob,1,8)
dob
[1] "9/9/43 1" "9/17/88 " "11/21/48"
dob.abridged <- gsub(" $","", dob.abridged, perl=T)
> dob.abridged
[1] "9/9/43 1" "9/17/88"  "11/21/48"

所以我的代码适用于长度为6或7但不长度为8的日历日期。有关使用gsub的更有效的正则表达式的任何指针都可以处理长度为6,7或8的日历日期吗?

谢谢。

4 个答案:

答案 0 :(得分:103)

不需要substring,只需使用gsub

gsub( " .*$", "", dob )
# [1] "9/9/43"   "9/17/88"  "11/21/48"

空格(),然后任意字符(.)任意次(*),直到字符串结尾($)。请参阅?regex以了解正则表达式。

答案 1 :(得分:14)

我经常使用strsplit来解决这些问题,但我喜欢罗曼的回答是多么简单。我认为将Romain的解决方案与strsplit答案进行比较会很有趣:

这是一个strsplit解决方案:

sapply(strsplit(dob, "\\s+"), "[", 1)

使用microbenchmark软件包和dob <- rep(dob, 1000)与原始数据:

Unit: milliseconds
                                    expr       min        lq    median
                   gsub(" .*$", "", dob)  4.228843  4.247969  4.258232
 sapply(strsplit(dob, "\\\\s+"), "[", 1) 14.438241 14.558832 14.634638
        uq       max neval
  4.268029  5.081608  1000
 14.756628 53.344984  1000

Win 7机器上的明显赢家是来自Romain的gsub正则表达式。感谢Romain的回答和解释。

答案 2 :(得分:0)

另一种在空格前从字母表中提取字符的方法是:

你必须安装包:"stringr"

stringr::str_extract(c("juan carlos", "miguel angel"), stringr::regex(pattern = "[a-z]+(?=\\s)", ignore_case = F))

[a-z]:匹配 a 和 z 之间的每个字符(以 Unicode 代码点顺序)。

+:1 个或更多。

(?=\\s):先行,后跟 \s(空白)(不匹配 \s)。

更多信息:https://stringr.tidyverse.org/articles/regular-expressions.html

答案 3 :(得分:-1)

另一个仅提取日期的正则表达式模式

library(stringr)
str_extract(dob, regex("\\d{1,}\\/\\d{1,}\\/\\d{1,}"))
#[1] "9/9/43"   "9/17/88"  "11/21/48"
  • \\d{1,}:至少匹配数字1次
  • \\/:转义斜杠