从R中的字符串中提取带有子子串的模式

时间:2015-09-23 20:56:07

标签: 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")

您可以注意到,最后一组数字是事件日期。我想将它们转换为日期

date <- c("2015-05-14","2014-10-28","2015-04-04","2014-11-01","2015-05-13","2015-03-05")

感觉我必须将这种子串起来(&#34; 5.14.15&#34;,&#34; 10.28.14&#34;,&#34; 4.4.15&#34;,&#34; 11.01模式的.14&#34;,&#34; 5.13.15&#34;,&#34; 3.5.15&#34;),然后进行日期转换。

任何人都可以帮我吗?谢谢!

3 个答案:

答案 0 :(得分:5)

在基础R中,如果日期始终位于字符串的末尾,则可以使用

as.Date(sub(".*\\s", "", data), "%m.%d.%y")
# [1] "2015-05-14" "2014-10-28" "2015-04-04" "2014-11-01"

这里,正则表达式只是

  • .*一切
  • \\s空格字符

因此,这将删除所有内容,包括最终的空格字符。

答案 1 :(得分:3)

最快的方法是使用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.]+)$搜索到达由美元符号标记的字符串末尾的最长的数字和小数点。 parantheses在其中创建一组令牌。我们将使用该组进行下一步。

  • "\\1"从模式中返回捕获组,并丢弃匹配的其余部分。

有许多网站会比我更能进一步进入正则表达式。由于它几乎用于所有编程语言,因此在您的研究中投入至少几个小时是非常值得的。

我在线学习了这本免费的Perl书。查看Ch。 5在这里:

https://www.perl.org/books/beginning-perl/

本网站有一个专注于R

的小节

http://www.regular-expressions.info/rlanguage.html

答案 2 :(得分: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"

正则表达式"[0-9]+(\\.[0-9]+){2}$"表示&#34;多个数字([0-9]+),后跟两个({2})个实例(一个点(\\.))后跟一个以上的数字[0-9]+),然后是字符串的结尾($)&#34;