【问题标题】:R: Find product codes using Regular Expressions [closed]R:使用正则表达式查找产品代码 [关闭]
【发布时间】:2016-03-10 23:20:50
【问题描述】:

所以我有一个产品项目描述列表。我已将其加载到 R 中。这些描述中的大多数都是无稽之谈,我们正试图从中提取一个像样的项目代码。

我可以在 R 中使用正则表达式来创建一个仅包含列表中整数值的新向量,而不是逐行遍历它吗?

我现在有大部分代码

JJ <- read.csv2(file.choose(),header= TRUE)
JJ$X <- gsub(pattern = "[0-9]+", replacement = "", 
    x = JJ$LGY_DHB_ITEM_DESCRIPTION, ignore.case = TRUE)

但我不确定要在替换参数中添加什么。

【问题讨论】:

  • 你很可能可以,你能举个例子吗?

标签: regex r expression gsub


【解决方案1】:

您可以尝试用空字符串替换非 (^) 数字 ([:digit:]) 字符:

gsub("[^[:digit:]]*", "", 'PRIVATE CONTRACT INV 710456354')
[1] "710456354"

但如果字符串中有多个数字,这将不起作用:

gsub("[^[:digit:]]*", "", 'PRIVATE 123 CONTRACT INV 710456354')
[1] "123710456354"

您可以尝试在每个字符串中找到最长的数字:

JJ <- data.frame(LGY_DHB_ITEM_DESCRIPTION=c('PRIVATE CONTRACT INV 710456354', 'PRIVATE 123 CONTRACT INV 710456354'))
m <- gregexpr("[0-9]*", JJ$LGY_DHB_ITEM_DESCRIPTION)
all_m <-  regmatches(JJ$LGY_DHB_ITEM_DESCRIPTION, m)
JJ$X <- mapply(FUN =function(stri,idx) stri[idx],all_m, sapply(lapply(all_m,nchar),which.max))
JJ
            LGY_DHB_ITEM_DESCRIPTION         X
1     PRIVATE CONTRACT INV 710456354 710456354
2 PRIVATE 123 CONTRACT INV 710456354 710456354

【讨论】:

  • 应该是 "[0-9][0-9]*" 以确保它匹配一个至少有一位数字的整数? (或者“[0-9]+”,我不懂R,只有正则表达式)
  • grep 不提取任何内容(不,我不是反对者)
  • oups @thelatemail,太快了,感谢您成为评论者而不是投票者
  • @eewanco 听起来不错,但我不知道在替换参数中添加什么。
猜你喜欢
  • 1970-01-01
  • 2014-05-13
  • 2022-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-25
相关资源
最近更新 更多