如何用R函数为字符串中的所有数值统一添加颜色标记?
问题分析
原代码的核心问题在于:
- 字符串按空格分割后,很多数值和单位/标点连在一起(比如
5,9cm.、19mm),并非纯数字,原条件value == gsub(".*(\\b\\d+\\b).*", "\\1", text)只能匹配纯单个数字(比如56),无法覆盖带单位/标点的数值元素。 - 用整个
text提取的第一个数值去和每个value对比,逻辑错误,只能匹配到一个元素,无法覆盖所有数值。
解决方案
调整数值检测的逻辑,用正则表达式判断每个元素是否包含数值(支持整数、带逗号的小数,以及后面跟随单位/标点的情况),然后统一上色。修正后的代码如下:
library(tidyverse) library(crayon) library(stringr) # 原始文本 text <- tolower(c("Kyste simple inférieur de 56 mm. Aorto-bi-iliaque en 5,9cm. Artères communes de 19mm et de 87mm. 120mm stable.")) # 分割字符串为单个元素(保留原空格分割的结果) split_text <- str_split(text, " ")[[1]] # 创建数据框并处理颜色标记 df <- tibble(value = split_text) %>% mutate( value2 = case_when( # 匹配特定单词,设为绿色 value == "aorto-bi-iliaque" ~ green(value), # 匹配数值相关元素:整数、带逗号的小数,可跟随mm/cm或标点 str_detect(value, "^\\d+(,\\d+)?(mm|cm)?\\.?$") ~ blue(value), # 其他元素保持原样 TRUE ~ value ) ) # 打印结果(cat直接输出,不需要print包裹) cat(df$value2, sep = " ")
关键修改说明
- 替换了原
unique_words函数,直接用str_split分割字符串,避免unique去重导致原文本顺序丢失。 - 用
str_detect结合正则表达式^\\d+(,\\d+)?(mm|cm)?\\.?$检测数值元素:^\\d+:以数字开头(,\\d+)?:可选的带逗号的小数部分(mm|cm)?:可选的单位mm或cm\\.?$:可选的结尾标点,以句号结束
- 去掉了多余的
print包裹cat,直接用cat输出即可保留空格分隔的格式。
运行后,所有数值元素(包括56、5,9cm.、19mm、87mm、120mm)都会显示为蓝色,特定单词aorto-bi-iliaque显示为绿色,其他文本保持原样。
内容的提问来源于stack exchange,提问作者Patrizio Messara
相关产品推荐
相关产品推荐

