如何用数字对字符串动态字符进行子处理(例如:$ 1000,100units)

时间:2019-01-07 15:21:34

标签: r regex gsub

我正在尝试进行数据清理,这需要根据特定的模式来清理一些文本,但是我仍然基于RegExCheatsheet在正则表达式上还是一个新手,我正在尝试一些简单的数据正则表达式清洁(去除$ 1000和1000pcs之类的任何图案)。

下面是我的示例字符串:

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

我尝试了以下方法

x <- c("(Promotion) stuff ABC 1pcs",
       "(Trial) $200 stuff XYZ 20pcs", 
       "(Test) $1000 stuff WER 5000pcs")

gsub('$[0-9][0-9][0-9][0-9]','',x) #replace all $200, $1000 & 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"

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

4 个答案:

答案 0 :(得分:6)

我们可以执行以下操作

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

这将替换空格,后跟$和至少一位数,或者至少一位数字后跟pcs。因此,与您的方法相比,我添加了|作为OR运算符,并使用+来允许一个或多个数字(其中\\d与您的{{1} }。


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

[0-9]

处理前导/后缀空格和多个空格。

答案 1 :(得分:2)

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

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

答案 2 :(得分:1)

您可以使用此正则表达式,该正则表达式捕获任何连续的文本,该连续的文本内部没有任何空格,并且内部或开头或结尾至少有一位数字,

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

并将其替换为空字符串。

Demo

答案 3 :(得分:0)

一个相当新手的答案:

library(tidyverse)
x <- c("(Promotion) stuff ABC 1pcs", "(Trial) $200 stuff XYZ 200pcs", "(Test) $1000 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 "