我有一个像这样的字符串:
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)
默认情况下,使用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"
添加应该这样做的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