使用正则表达式清洁 sparklyr 中的字符串

Cleaning strings in sparklyr using regex

我正在尝试使用 regexp_replace 清理 sparklyr 中 table 中的字符串。我需要删除单词之间的多个空格和特定的整个单词。

建立Spark连接

pharms <- spark_read_parquet(sc, 'pharms', 's3/path/to/pharms', infer_schema = TRUE, memory = FALSE)

要清理的向量

我要清理的 df 向量看起来像这样,但它在 sparklyr 连接中的 table 内:

drug_strings <- c("tablomiacin sodium tab      mg", "nsaid  caps  mg")

正则表达式处理数据后所需的输出将如下所示:

期望的结果

[1] "tablomiacin sodium", "nsaid"

尝试次数

我尝试了正则表达式中使用的各种组合,例如:

pharms_cln <- pharms %>%
  distinct(drug_strings)%>%
  mutate(new_strings=regexp_replace(drug_strings, "\b(caps|mg|tab)\b", ""))

pharms_cln <- pharms %>%
  distinct(drug_strings)%>%
  mutate(new_strings=regexp_replace(drug_strings, "\s+", ""))

但它们都只是替换所有字母或子字符串,而不仅仅是单个单词或打印与配置单元相关的错误。同样,我试图删除空格的努力似乎只是删除了字母 's'.

知道正则表达式的人当然可以简化这段代码,但下面使用 stringr 包中的 str_remove 函数。

drug_strings <- c("tablomiacin tab      mg", "nsaid  caps  mg")

drug_strings <- data.frame(drug_strings)

drug_strings <- drug_strings %>% 
mutate(new_strings=str_remove(drug_strings, "\b(caps|mg|tab)\b")) %>% 
mutate(new_strings=str_remove(new_strings, "\s+")) %>% 
mutate(new_strings = str_remove(new_strings, "mg"))
``

如果寻找替换的规则是“caps|mg|tab 之前的任何内容”,那么这可能有效:

数据:

drug_strings <- c("tablomiacin sodium tab      mg", "nsaid  caps  mg") 

解决方案:

trimws(gsub("\b(tab|mg|caps)\b", "", drug_strings))
[1] "tablomiacin sodium" "nsaid"

如果出于某种原因您需要使用 str_extract,您可以这样做:

str_extract(gsub("\s{2,}", " ", drug_strings), "\b\w+\b(\s\b\w+\b)*(?=\s\b(tab|mg|caps)\b)")

这首先将所有多个白色 space 字符减少为一个这样的字符,然后进行提取。