Как добавить в строку динамический символ с помощью числа (например: $ 1000, 100 единиц) - PullRequest
0 голосов
/ 07 января 2019

Я пытаюсь выполнить очистку данных, которые требуют очистки некоторого текста на основе определенного шаблона, но я все еще новичок в регулярном выражении, основанном на RegExCheatsheet , я попробую несколько простых регулярных выражений для очистки данных (удалите любой шаблон, например, 1000 и 1000 долларов США).

Ниже приведены примеры строк:

[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"? Обратите внимание, что диапазон данных для $ и шт неизвестен, может начинаться с 1 до 10000 или более.

Ожидаемый результат (после подстроки):

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

Любая помощь и комментарии приветствуются, спасибо!

Ответы [ 4 ]

0 голосов
/ 07 января 2019

Вы можете использовать это регулярное выражение, которое фиксирует любой непрерывный текст, не имеющий пробела внутри него, и в котором есть хотя бы одна цифра, либо внутри, либо в начале, либо в конце,

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

И заменить его пустой строкой.

Демо

0 голосов
/ 07 января 2019

Используя gsub, мы можем удалить любое слово, которое содержит цифру и необязательный аргумент $ из строки.

gsub("\\$?[0-9]+\\w+", "", x)
#[1] "(Promotion) stuff ABC " "(Trial)  stuff XYZ "    "(Test)  stuff WER " 
0 голосов
/ 07 января 2019

Довольно начинающий ответ:

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 " 
0 голосов
/ 07 января 2019

Мы можем сделать следующее

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" 

Заменяет пробел, за которым следует $ и хотя бы одна цифра или хотя бы одна цифра, за которой следует шт. Итак, сравнивая с вашим подходом, я добавил | в качестве оператора ИЛИ и использовал +, чтобы разрешить одну или несколько цифр (и где \\d совпадает с вашим [0-9]).


Приведенный выше подход предполагает, что цель находится не в начале строки. В противном случае мы можем сделать

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

, который имеет дело с начальными / конечными пробелами и пробелами.

...