哪个正则表达式更合适?

时间:2018-01-24 17:11:52

标签: r regex gsub string-substitution gsubfn

我正在尝试使用我的变量的预定义标签使模型输出更漂亮。我有一个变量名称向量(a),标签向量(b)和模型术语(c)。

我必须匹配向量(a)和(c)并用(b)代替(a)。我发现这个question向我介绍了包gsubfn中的函数library(gsubfn)。该函数匹配并替换多个字符串。按照他们的例子,它在我的情况下无法正常工作:

library(gsubfn)

a <- c("ecog.ps", "resid.ds", "rx")
b <- c("ECOG-PS", "Residual Disease", "Treatment")
c <- c("ecog.psII", "rxt2", "ecog.psII:rxt2")

gsubfn("\\S+", setNames(as.list(b), a), c)
[1] "ecog.psII"      "rxt2"           "ecog.psII:rxt2"

如果我使用特定模式,那么它可以工作:

gsubfn("ecog.ps", setNames(as.list(b), a), c)
[1] "ECOG-PSII"      "rxt2"           "ECOG-PSII:rxt2"

所以我猜我的问题是在函数gsubfn中用作参数模式的正则表达式。我检查了这个R-pub和哈德利book的正则表达式。 \S+似乎足够了。我尝试了其他正则表达式但没有成功:

gsubfn("[:graph:]", setNames(as.list(b), a), c)
[1] "ecog.psII"      "rxt2"           "ecog.psII:rxt2"

gsubfn("[:print:]", setNames(as.list(b), a), c)
[1] "ecog.psII"      "rxt2"           "ecog.psII:rxt2"

在函数gsubfn中应该使用哪种模式来匹配向量(a)和(c),用(b)代替(a)?

1 个答案:

答案 0 :(得分:1)

\S+模式完全匹配ecog.psIIecog.psII:rxt2,并且列表中没有包含此类名称的项目。您可以从a向量动态创建模式,并使用它来查找所需的匹配项。

使用

pat <- paste(a, collapse="|")
## Or, if there can be special chars that must be escaped (note . must also be escaped)
pat <- paste(gsub("([][/\\\\^$*+?.()|{}-])", "\\\\\\1", a), collapse="|")
## => ecog\.ps|resid\.ds|rx

然后使用

gsubfn(pat, setNames(as.list(b), a), c)

如果你没有转义特殊字符,你可能会超匹配(因为.匹配任何字符),匹配错误的字符串(如果有量词或其他正则表达式运算符)或者可能发生错误(如果存在类似的字符) (),未配对[等)。