使用gsub查找并替换正则表达式

时间:2014-06-30 05:47:28

标签: regex r gsub

我的数据格式为字符向量:

"2014-03-27 11:42:32" "2014-04-03 07:13:28" "0000-00-00 00:00:00" "2012-04-16 12:46:03"
[5] "0000-00-00 00:00:00" "0000-00-00 00:00:00" "2014-04-23 09:33:23" "2014-04-30 06:31:54"[9] "2012-04-18 09:55:44" "2013-11-20 14:43:11" 

我想要做的是使用一年中的单个数字。 I.E. 2014年的4分,2013年的3分,2012年的2分和0000-00的1分...除了代表年份的单个数字,我想删除所有其他数字和字符。

我知道我可以使用正则表达式和gsub(pattern="2014", replacement="4", logVector)或某些变体来完成我的任务,但我并不精通正则表达式。是否有人能够提供语法方面的帮助?

3 个答案:

答案 0 :(得分:7)

这就是你需要的:

sub("^\\d{3}(\\d).*", "\\1", subject, perl=TRUE);

我们需要捕获一年中的最后一位数字,然后用该数字替换整个字符串。

<强>解释

  • ^锚点断言我们位于字符串的开头
  • \d{3}匹配三位数字
  • (\d)匹配第四位数字并将其捕获到第1组
  • .*匹配字符串
  • 的结尾
  • \1将整个字符串替换为第1组,即最后一位数。

答案 1 :(得分:2)

这是您正在寻找的模式:

gsub("^2014.*", "4", data) 

这个版本更广泛,将用2011年到2019年的相应数字替换年份,但您需要运行第二行来处理0000案例。

gsub("^201([1-9]).*", "\\1", data)
gsub("^0000.*", "0", data)

答案 2 :(得分:1)

除了

之外,您还可以使用?substr提取第4个字符
substr(data,4,4)
# [1] "4" "4" "0" "2" "0" "0" "4" "4" "2" "3"

 library(stringr)
  str_extract(data, perl('(?<=\\d{3})\\d')) 
 #[1] "4" "4" "0" "2" "0" "0" "4" "4" "2" "3"

解释

(?<=\\d{3}) # look behind for three digits
\\d # followed by the digit that needs to be extracted

假设你想要几个月:

str_extract(data, perl('(?<=\\d{4}-)\\d{2}')) #look behind 4 digits followed by `-`
#[1] "03" "04" "00" "04" "00" "00" "04" "04" "04" "11"