如何用数字对动态字符进行子字符串化(例如:$1000、100 个单位)

How to sub string dynamic character with numric (eg: $1000, 100units)

我正在尝试进行数据清理,需要根据特定模式清理一些文本,但我对正则表达式还是很陌生,基于 RegExCheatsheet,我想尝试一些简单的正则表达式用于数据清理(删除任何模式,如 $1000 和 1000pcs)。

下面是我的示例字符串:

[1] "(Promotion) stuff ABC 1pcs"
[2] "(Trial) 0 stuff XYZ 200pcs"
[3] "(Test) 00 stuff WER 5000pcs"

我试过下面的方法

x <- c("(Promotion) stuff ABC 1pcs",
       "(Trial) 0 stuff XYZ 20pcs", 
       "(Test) 00 stuff WER 5000pcs")

gsub('$[0-9][0-9][0-9][0-9]','',x) #replace all 0, 00 & etc.. into ""
gsub('[0-9][0-9][0-9][0-9]pcs','',x) #replace all 1pcs, 20pcs, 5000pcs & etc.. into ""

问题:有没有更好的(更动态的正则表达式)来捕获“$200 / 5000pcs”模式?请注意,$ 和 pcs 的数据范围是未知的,可能从 1 开始到 10000 或更多。

预期结果(子字符串后):

[1] "(Promotion) stuff ABC"
[2] "(Trial) stuff XYZ"
[3] "(Test) stuff WER"

欢迎任何帮助和评论,谢谢!

我们可能会做以下事情

x <- c("(Promotion) stuff ABC 1pcs", "(Trial) 0 stuff XYZ 200pcs", "(Test) 00 stuff WER 5000pcs")
gsub(" (\$\d+|\d+pcs)", "", x)
# [1] "(Promotion) stuff ABC" "(Trial) stuff XYZ"     "(Test) stuff WER" 

这将替换 space 后跟 $ 和至少一位数字或至少一位数字后跟 pcs。因此,与您的方法相比,我添加了 | 作为 OR 运算符并使用 + 来允许一个或多个数字(并且 \d 与您的 [0-9]).


上述方法假定目标不在字符串的开头。否则我们可能会做

gsub("  ", " ", trimws(gsub("\$\d+|\d+pcs", "", "0  0  stuff XYZ 200pcs")))
# [1] "stuff XYZ"

处理 leading/trailing spaces 白色 space 和多个 spaces.

使用 gsub 我们可以从字符串中删除任何包含数字和可选 $ 参数的单词。

gsub("\$?[0-9]+\w+", "", x)
#[1] "(Promotion) stuff ABC " "(Trial)  stuff XYZ "    "(Test)  stuff WER " 

比较菜鸟的回答:

library(tidyverse)
x <- c("(Promotion) stuff ABC 1pcs", "(Trial) 0 stuff XYZ 200pcs", "(Test) 00 stuff WER 5000pcs")
x %>% 
  str_remove_all("\$(?=[0-9])") %>% 
  str_remove_all("\d") %>% 
  str_remove_all("pcs")

编辑: 或:

x %>% 
  str_remove_all("\$(?=[0-9]+)") %>% 
  str_remove_all("\d|pcs")

结果相同但更长:

#"(Promotion) stuff ABC " "(Trial)  stuff XYZ "    "(Test)  stuff WER " 

您可以使用此正则表达式,它会捕获其中没有任何 space 且至少有一个数字的任何连续文本,无论是在其中还是在开头或结尾,

[^\s]*\d+[^\s]* ?

并将其替换为空字符串。

Demo