【问题标题】:Using gsub to find and replace with a regular expression使用 gsub 查找并用正则表达式替换
【发布时间】:2023-12-12 15:20:01
【问题描述】:

我有以下格式的字符向量中的数据:

"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" 

我想做的是使用一个数字来表示年份。 IE。 sub 4 代表 2014 年,3 代表 2013 年,2 代表 2012 年,1 代表 0000-00...除了代表年份的单个数字之外,我想删除所有其他数字和字符。

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

【问题讨论】:

  • "2014-03-27 11:42:32" 是一个字符串
  • 你真的应该在这里保留日期格式

标签: regex r gsub


【解决方案1】:

这是你需要的:

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

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

说明

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

【讨论】:

    【解决方案2】:

    这是您正在寻找的模式:

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

    这个更广泛一些,将用适当的数字替换 2011 年到 2019 年的年份,但您需要运行第二行来处理 0000 的情况。

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

    【讨论】:

      【解决方案3】:

      除了

      之外,还可以使用?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"
      

      【讨论】:

        最近更新 更多