我正在尝试进行数据清理,这需要根据特定的模式来清理一些文本,但是我仍然基于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"
欢迎任何帮助和评论,谢谢!
答案 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)
答案 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 "