【问题标题】:Deleting Text Substings with a Wildcards r使用通配符 r 删除文本替换
【发布时间】:2019-11-13 17:19:36
【问题描述】:

我想删除作为向量一部分的几个文本字符串的一部分。我要删除的实例是#.##oz。其中 # 是 1 到 9(含)之间的任何整数。

FoodVector <- c("kraft easy mac cup 2.05oz each", "tuna kit bumble bee 3.05oz each", "lance cheddar cheese wh grain 1.50oz each", "some item 1.0oz")

结果应该是:

[1] kraft easy mac cup each 
[2] tuna kit bumble bee each
[3] lance cheddar cheese wh grain each
[4] some item 1.0oz

对于这样的事情,我通常会使用 gsub() 或 str-replace()。但是我无法弄清楚通配符语言。比如

gsub("*.**oz", "", FoodVector)

结果:

Error in gsub("*.**", "", FoodVector) : 
  invalid regular expression '*.**', reason 'Invalid use of repetition operators'

【问题讨论】:

  • 我真的很喜欢 regexone.com 来学习用于文本操作的正则表达式(也就是正则表达式)。在大约 30 分钟内,您可以学习 80% 的任何您需要的正则表达式。

标签: r string str-replace gsub


【解决方案1】:

您可以使用 gsub 删除单个数字的所有实例,然后是 .,然后是两个数字,然后是空格。

注意:您的描述是 1 到 9 之间的整数,没有提到空格。此解决方案查找 0 到 9 之间的数字并查找空格,以匹配问题中显示的结果

gsub('\\d{1}\\.\\d{2}oz ', '', FoodVector)
# [1] "kraft easy mac cup each"           
# [2] "tuna kit bumble bee each"          
# [3] "lance cheddar cheese wh grain each"
# [4] "some item 1.0oz" 

为了解决 Rui 在下面的观点,您可以允许空间位于 d.ddoz 之前或之后

FoodVector <- c(FoodVector, '1.23oz some words', 'more words 3.45oz')

gsub('\\d{1}\\.\\d{2}oz | \\d{1}\\.\\d{2}oz', '', FoodVector)
# [1] "kraft easy mac cup each"           
# [2] "tuna kit bumble bee each"          
# [3] "lance cheddar cheese wh grain each"
# [4] "some item 1.0oz"                   
# [5] "some words"                        
# [6] "more words" 

【讨论】:

  • 前面的空间不是更安全吗?如果末尾没有 " each",则 "oz" 后面的空格将无法匹配字符串。 (我知道不是贴出来的case,只是说前面的空格和这两个case都匹配。)
  • 我会按照惯例 24 小时开放这篇文章。但这正是我所需要的。
猜你喜欢
  • 2015-12-06
  • 2011-06-04
  • 2014-02-24
  • 2016-10-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-02
相关资源
最近更新 更多