如何用数字对动态字符进行子字符串化(例如:$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]* ?
并将其替换为空字符串。
我正在尝试进行数据清理,需要根据特定模式清理一些文本,但我对正则表达式还是很陌生,基于 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]* ?
并将其替换为空字符串。