Regex 从R中的字符串中提取具有点子字符串的图案
我有一组像这样的角色Regex 从R中的字符串中提取具有点子字符串的图案,regex,r,date,pattern-matching,substring,Regex,R,Date,Pattern Matching,Substring,我有一组像这样的角色 data <- c("ABS Spring Meeting 5.14.15", "DEFG Sellors Tour 10.28.14", "DDCC Fun at the Museum 4.4.15", "GAME CS vs. Washington 11.01.14", "BSS Studio 54 5.13.15","Pas-12 3.5.15") data最快的方法是使用lubridate。如果您提供通用格式,它将尝试为您找出: library(lubrid
data <- c("ABS Spring Meeting 5.14.15", "DEFG Sellors Tour 10.28.14", "DDCC Fun at the Museum 4.4.15", "GAME CS vs. Washington 11.01.14", "BSS Studio 54 5.13.15","Pas-12 3.5.15")
data最快的方法是使用lubridate
。如果您提供通用格式,它将尝试为您找出:
library(lubridate)
mdy(data)
[1] "2015-05-14 UTC" "2014-10-28 UTC" "2015-04-04 UTC" "2014-11-01 UTC"
如果您的数据与其他数字变得更加复杂,您可以使用字符串提取方法。像这样:
mdy(sub(".*?([0-9.]+)$","\\1", data))
在模式“*?([0-9.]+)$”中
:
*?
匹配所有字符和空格。问号允许模式的下一部分完全匹配
([0-9.]+)$
搜索到达以美元符号标记的字符串末尾的最长数字和小数点。偏执狂在其中创建了一组标记。下一步我们将使用该组
“\\1”
从模式中返回捕获组,并丢弃剩余的匹配项
有许多网站将比我更深入地研究正则表达式。因为它几乎在每一种编程语言中都使用,所以花至少几个小时研究它是值得的
通过这本免费的Perl在线书籍,我学到了很多东西。在这里查看第5章:
本网站有一个小节,重点介绍R
数据以R为基数,如果日期始终位于字符串末尾,则可以使用
as.Date(sub(".*\\s", "", data), "%m.%d.%y")
# [1] "2015-05-14" "2014-10-28" "2015-04-04" "2014-11-01"
这里,正则表达式是简单的
*
一切
\\s
空格字符
因此,这将删除包括最后一个空格字符在内的所有内容。很酷,而且有点令人担忧的是,mdy()
只是忽略了所有无关的字眼……lubridate只对我的数据库部分起作用。我的整个表格包含大约300个名称,名称中还包含一些其他数字,例如“BSS Studio 54 5.13.15”,那么它不适用于此。添加了提取方法。非常感谢,它非常完美。但还有一个小问题,“\\1”是什么意思?它用整个匹配替换了偏执论中的部分。我将补充更多的答案。其他字符,如“BSS Studio 54 5.13.15”,“Pas-12 3.5.15”非常感谢,但你能解释一下“[0-9]+(\\\.[0-9]+){2}$”吗?我正在学习。
data <- data <- c("ABS Spring Meeting 5.14.15",
"DEFG Sellors Tour 10.28.14", "DDCC Fun at the Museum 4.4.15",
"GAME CS vs. Washington 11.01.14", "BSS Studio 54 5.13.15",
"Pas-12 3.5.15")
library("lubridate")
library("stringr")
mdy(str_extract(data,"[0-9]+(\\.[0-9]+){2}$"))
## [1] "2015-05-14 UTC" "2014-10-28 UTC" "2015-04-04 UTC" "2014-11-01 UTC"
## [5] "2015-05-13 UTC" "2015-03-05 UTC"
as.Date(sub(".*\\s", "", data), "%m.%d.%y")
# [1] "2015-05-14" "2014-10-28" "2015-04-04" "2014-11-01"