我有一个像这样的字符串:
vect <- c("Thin lines are not great, I am in !!! AND You shouldn't be late OR you loose")
Run Code Online (Sandbox Code Playgroud)
我想将"in"替换为%in"","AND"to"&","OR"to"|".
我知道这可以使用gsub完成,如下所示:
gsub("\\bin\\b","%in%", vect),
Run Code Online (Sandbox Code Playgroud)
但是每次替换我需要三条不同的线,因此我选择使用gsubfn.
所以我试过,
gsubfn("\\bin\\b|\\bAND\\b|\\bOR\\b", list("in"="%in%", "AND"= "&", "OR"="|"), vect)
Run Code Online (Sandbox Code Playgroud)
但它返回一个没有任何改变的字符串,由于某种原因\\b不适用于该字符串.但是,\\b确实很好用,gsub并且我可以通过使用管道来替换所有三个字符串gsub.
我的问题是,为什么\\b不在里面工作gsubfn.我的正则表达式中缺少什么?
请帮忙.
输出应该是:
"Thin lines are not great, I am %in% !!! & You shouldn't be late | you loose"
Run Code Online (Sandbox Code Playgroud)
这有效:
gsubfn("\\w+", list("in"="%in%", "AND"= "&", "OR"="|"), vect)
Run Code Online (Sandbox Code Playgroud)
默认情况下,使用Tcl正则表达式引擎,请参阅gsubfndocs:
如果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"
Run Code Online (Sandbox Code Playgroud)
另一种方法是使用\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"
Run Code Online (Sandbox Code Playgroud)
您可以通过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"
Run Code Online (Sandbox Code Playgroud)