我有一个这样的字符串:
vect <- c("Thin lines are not great, I am in !!! AND You shouldn't be late OR you loose")
我想将“in”替换为 %in%,“AND”替换为“&”,“OR”替换为“|”。
我知道这可以使用 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 :
因此,单词边界由 \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"
关于r - 为什么 R 中的 gsubfn 中的\\b 不适合我?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47846159/