【问题标题】:R gsub fixed pattern and non-fixed pattern at the same timeR gsub 同时固定模式和非固定模式
【发布时间】:2018-02-02 20:37:27
【问题描述】:

我在 R data.table 的数据中有一个列,其中包含如下文本:

> my_table
                           descr
   1:   DESCRIPTIONA - JONES:4:2
   2:  DESCRIPTIONB - WILDER:6:7
  ---                          
 253:    DESCRIPTIONA - MANN:5:8
 254: DESCRIPTIONB - ROBERTS:3:4

注意有两种描述:DESCRIPTIONADESCRIPTIONB。如果是DESCRIPTIONA,我想用AB(如果是DESCRIPTIONB)替换整个描述部分,包括直到第一个分号的名称。这意味着我完全不在乎这个名字。输出应如下所示:

> my_table
      descr
   1: A:4:2
   2: B:6:7
  ---                          
 253: A:5:8
 254: B:3:4

我正在尝试使用 gsub 来完成此操作,但我无法让正则表达式仅替换 (DESCRIPTIONA - JONES):4:2 部分。这很困难,因为每个名字都不一样,长度也不一样。有什么想法吗?

【问题讨论】:

    标签: r regex data.table gsub


    【解决方案1】:
    x = c(
        "DESCRIPTIONA - JONES:4:2",
        "DESCRIPTIONB - WILDER:6:7",
        "DESCRIPTIONA - MANN:5:8",
        "DESCRIPTIONB - ROBERTS:3:4"
    )
    
    gsub(pattern = "DESCRIPTION(.)[^:]*", replacement = "\\1", x)
    # [1] "A:4:2" "B:6:7" "A:5:8" "B:3:4"
    

    解释:"DESCRIPTION(.)[^:]*" 匹配单词 DESCRIPTION,然后是单个字符 (.),它被括号 ()“保存”为捕获组,然后继续尽可能多地匹配非冒号字符[^:] (*)。它将完整匹配替换为第一个 (\\1) 捕获组。

    您可以在这里玩一下以更好地理解:https://regex101.com/r/Sc7oC1/1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-02-22
      • 2015-04-06
      • 1970-01-01
      • 2012-04-05
      • 1970-01-01
      • 2021-08-18
      • 2021-09-13
      相关资源
      最近更新 更多