一位用户问我如何做到这一点如何使 ggplot 图例中的选定单词变为斜体? https://stackoverflow.com/questions/76054997/how-to-italicize-select-words-in-a-ggplot-legend/76055093?noredirect=1#comment134133550_76055093,并且我对我的解决方法不满意。
目的是在除给定字符串之外的所有字符向量元素周围添加封闭的 *。对于这个例子,我们假设这些总是在开头找到。我对第一组使用可选捕获,然后将第二组包含在星号中。当搜索的单词单独存在并且没有后续字符串时,就会出现问题。
我已在代码中包含了所需的输出和一些尝试。
v <- head(rownames(mtcars))
## does also not work with (.*)?, nor with (.+) nor (.+)?
gsub("(Hornet |Valiant)?(.*)", "\\1\\*\\2\\*", v)
#> [1] "*Mazda RX4*" "*Mazda RX4 Wag*" "*Datsun 710*"
#> [4] "Hornet *4 Drive*" "Hornet *Sportabout*" "Valiant**"
## desired output
ifelse(grepl("Valiant", v), v, gsub("(Hornet )?(.*)", "\\1\\*\\2\\*", v) )
#> [1] "*Mazda RX4*" "*Mazda RX4 Wag*" "*Datsun 710*"
#> [4] "Hornet *4 Drive*" "Hornet *Sportabout*" "Valiant"
两个正则表达式引擎都不能与gsub
支持条件替换模式。
您可以使用
v <- c("Mazda RX4","Mazda RX4 Wag","Datsun 710","Hornet 4 Drive","Hornet Sportabout","Valiant")
gsub("^(?:Hornet|Valiant)\\s*(*SKIP)(*F)|(.+)", "*\\1*", v, perl=TRUE)
See the 正则表达式演示 https://regex101.com/r/pQNNPm/1和R 在线演示 https://ideone.com/oqzoki.
Output:
[1] "*Mazda RX4*" "*Mazda RX4 Wag*" "*Datsun 710*"
[4] "Hornet *4 Drive*" "Hornet *Sportabout*" "Valiant"
为了确保第一个单词作为整个单词匹配,添加\b
: "^(?:Hornet|Valiant)\\b\\s*(*SKIP)(*F)|(.+)"
.
确保使用perl=TRUE
.
正则表达式详细信息:
-
^(?:Hornet|Valiant)\s*(*SKIP)(*F)
- 匹配Hornet
or Valiant
在字符串的开头,然后是零个或多个空格,一旦匹配,则丢弃并使匹配失败,并继续从失败位置查找下一个匹配
-
|
- or
-
(.+)
- 尽可能多地匹配除换行符之外的一个或多个字符(字符串的其余部分)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)