【问题标题】:Function in gsub replacement [duplicate]gsub替换中的功能[重复]
【发布时间】:2017-11-02 14:40:08
【问题描述】:

是否可以在gsub 替换短语中应用功能?假设在str_to_title 之后我们有

This Is One Hell Of A Blahblah Cake

我想从str_to_title函数的效果中忽略某些单词,这样我就有了

This is one Hell of a blahblah Cake

我知道 str_to_title 有自己的异常列表,但我想通过将某些短语恢复为小写来自定义该列表。

我目前的做法是

gsub("( Is | One | BlahBlah )", tolower("\\1"), str_to_title(x))

gsub 不会看到tolower 函数。一个想法如何实现这一目标?我们如何用作用于匹配字符串的函数替换正则表达式?

【问题讨论】:

  • 你确定它们一开始是小写的吗?你不应该遵循这种方法。您可以只使用tools::toTitleCase 代码并通过添加您的例外来修改它。
  • 也许您正在寻找包 gsubfn

标签: r regex string substring


【解决方案1】:

您可以在替换前加上\\L 将它们转换为小写:

s = "This Is One Hell Of A Blahblah Cake"

gsub("(\\bIs\\b|\\bOne\\b|\\bBlahblah\\b)", "\\L\\1", s, perl = T)
# [1] "This is one Hell Of A blahblah Cake"

或者正如@joran 评论的那样,你可以使用gsubfn 包:

library(gsubfn)
options(gsubfn.engine = "R")
gsubfn("\\bIs\\b|\\bOne\\b|\\bBlahblah\\b", ~ tolower(x), s)
# [1] "This is one Hell Of A blahblah Cake"

【讨论】:

  • gsub("(\\b(Is|One|Blahblah)\\b", "\\L\\1", s, perl = T) 也可以。我会放 ignore.case=T 以涵盖更大的范围。并且perl=T 必须在那里才能工作。你能解释一下这个perl=T 吗?
  • 同意\\b(Is|One|Blahblah)\\b 更简洁。并且perl=TRUE 允许您使用来自documentationPCRE 正则表达式库,它通常比基本R 正则表达式引擎更强大。在这种情况下,我们需要perl=TRUE 来使用\\L 修饰符。
  • @Kenny \L 运算符不是 PCRE 的一部分,它是 R 的 PCRE 库中内置的扩展。它在基于 PCRE 的 Boost 正则表达式库中实现。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-31
  • 1970-01-01
  • 2021-07-26
  • 1970-01-01
  • 1970-01-01
  • 2019-05-20
相关资源
最近更新 更多