为什么R中的gsubfn中没有\\ b为我工作?

问题描述 投票:7回答:2

我有一个像这样的字符串:

vect <- c("Thin lines are not great, I am in !!! AND You shouldn't be late OR you loose")

我想将“in”替换为%in“”,“AND”to“&”,“OR”to“|”。

我知道这可以使用gsub完成,如下所示:

gsub("\\bin\\b","%in%", vect),

但是每次替换都需要三条不同的线,因此我选择使用gsubfn

所以我试过,

gsubfn("\\bin\\b|\\bAND\\b|\\bOR\\b", list("in"="%in%", "AND"= "&", "OR"="|"), vect)

但它返回一个没有任何改变的字符串,由于某种原因,\\b不适用于该字符串。然而,\\b确实与gsub很好地工作,我能够用gsub将所有三个弦组合在一起。

我的问题是,为什么\\b不在gsubfn内部工作。我的正则表达式中缺少什么?

请帮忙。

输出应该是:

"Thin lines are not great, I am %in% !!! & You shouldn't be late | you loose"

这有效:

gsubfn("\\w+", list("in"="%in%", "AND"= "&", "OR"="|"), vect)
r regex gsubfn
2个回答
6
投票

默认情况下,使用Tcl正则表达式引擎,请参阅gsubfn docs

如果R安装具有tcltk功能,则使用tcl引擎,除非FUN是原型对象或perl=TRUE,在这种情况下使用“R”引擎(无论此参数的设置如何)。

因此,使用\y定义单词边界:

> gsubfn("\\y(in|AND|OR)\\y", list("in"="%in%", "AND"= "&", "OR"="|"), vect)
[1] "Thin lines are not great, I am %in% !!! & You shouldn't be late | you loose"

另一种方法是使用\m作为前导词边界,使用\M作为尾随词边界:

> gsubfn("\\m(in|AND|OR)\\M", list("in"="%in%", "AND"= "&", "OR"="|"), vect)
[1] "Thin lines are not great, I am %in% !!! & You shouldn't be late | you loose"

你可以通过perl=TRUE并使用\b

> gsubfn("\\b(in|AND|OR)\\b", list("in"="%in%", "AND"= "&", "OR"="|"), vect, perl=TRUE)
[1] "Thin lines are not great, I am %in% !!! & You shouldn't be late | you loose"

4
投票

添加应该这样做的perl = T

gsubfn("\\bin\\b|\\bAND\\b|\\bOR\\b", list("in"="%in%", "AND"= "&", "OR"="|"), vect, perl =T)

产量

[1] "Thin lines are not great, I am %in% !!! & You shouldn't be late | you loose"

来自gsub文档

gsub和gregexpr的POSIX 1003.2模式在重复的字边界(例如,pattern =“\ b”)时无法正常工作。对于这样的匹配使用perl = TRUE(但是对于非ASCII输入可能无法正常工作,因为'word'的含义取决于系统)。

和gsubfn文档

...其他gsub参数。

不解释为什么没有perl论证gsub工作正常,但要做gsubfn它需要perl=T

© www.soinside.com 2019 - 2024. All rights reserved.