【问题标题】:gsub replace pattern with backspacegsub 用退格替换模式
【发布时间】:2017-11-01 21:14:06
【问题描述】:

我有一个数据集,其中有一列包含带有年份的标签 (OldLabel),我想创建另一列只包含标签,而不是年份 (NewLabel)。我编写了以下代码,但它在新标签的末尾留下了一个空格。

data["NewLabel"] <- gsub("20..", "", data$OldLabel)
#removes any part of the OldLabel column that starts with 20 and ends with 2 digits, e.g: 2011 or 2008

有没有办法让 gsub 用退格替换序列,这样它就可以摆脱它替换的一年中的任何空格?我尝试使用"\\b" 作为我的替换文本,但这只是用b 替换它,而不是退格。

编辑:根据请求,OldLabel 的示例将是 "Valley Summer 2014",它应该成为 "Valley Summer",但最终使用我当前的代码成为 "Valley Summer "。但是,有些也可能是 2012 Valley Summer 的形式,所以我认为仅仅在模式中包含一个空格就足够健壮了。

【问题讨论】:

  • 看看OldLabel 的一些例子会有所帮助。如果要替换“20”+“2 位数字”,更好的正则表达式是“20\\d{2}”。
  • gsub("20\\d\\d", "", data$OldLabel) 非常清楚地显示了模式中表示的两位数字,这不如@neilfws 优雅。
  • 我将使用@ShawnMehan 的建议来保持可读性。不过,谢谢你们,这是一个比我拥有的更强大和优雅的模式。
  • 另见trimws,它会删除字符串开头或结尾的空格。如果需要,您可以使用此函数包装 gsub 的输出,但编写更智能的正则表达式 42- 建议可能是更好的方法。

标签: r gsub


【解决方案1】:

试试这个:

 data["NewLabel"] <- gsub("[ ]{0,1}20[[:digit:]]{2}[ ]{0,1}", "", data$OldLabel)

成对的花括号是重复量词,其范围由一个(精确)或两个(最小值和最大值)值确定。有关详细信息,请参阅?regex。 (您不想用退格字符替换它们。)

test <- c("2012 Valley Summer", "Valley Summer 2014")
gsub("[ ]{0,1}20[[:digit:]]{2}[ ]{0,1}", "", test)
#[1] "Valley Summer" "Valley Summer"

【讨论】:

  • 您对 gsub 工作方式的假设是问题所在。我再说一遍(现在用你修改的例子来证明)......你不需要退格
  • 啊,我明白了。谢谢你的澄清。我应该更仔细地阅读你的答案。为了后代,我最终得到了以下内容,这是您的答案、Aidan Gawronski 的答案和 Shawn Mehan 的评论的结合:data["NewLabel"] &lt;- gsub("\\s*20\\d\\d\\s*", "", data$OldLabel)
【解决方案2】:
data["NewLabel"] <- gsub("\\s*[0-9]\\s*", "", data$OldLabel)

【讨论】:

  • 这仍然会在它删除的部分之后留下一个空格。你能解释一下你的答案吗? "\\1" 应该做什么?
  • 这可能是你想要的,删除任何两边带有可选空格的数字。
  • 请尝试新选项。
  • 谢谢!在我的模式两侧添加\\s* 正是我所需要的。
  • 这不会将其修改限制为 4 位字符串,但会删除每个数字:单、对、三连音和年份。
猜你喜欢
  • 1970-01-01
  • 2021-07-26
  • 2021-12-11
  • 1970-01-01
  • 1970-01-01
  • 2013-12-09
  • 1970-01-01
  • 1970-01-01
  • 2013-04-30
相关资源
最近更新 更多