哪个正则表达式更合适?
Which regular expression is more appropriate?
我正在尝试使用预定义的变量标签使模型输出更漂亮。我有一个变量名称向量 (a)、一个标签向量 (b) 和模型项 (c)。
我必须匹配向量 (a) 和 (c) 并将 (a) 替换为 (b)。我发现这个 向我介绍了包 library(gsubfn)
中的函数 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, and Hadley's 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)并将(a)替换为(b)?
\S+
模式完全匹配 ecog.psII
和 ecog.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)
如果你不转义特殊字符,你可能会过度匹配(因为 .
匹配任何字符),匹配错误的字符串(如果有量词或其他正则表达式运算符)或者可能发生错误(如果有(
、)
、不成对的 [
等字符)。
我正在尝试使用预定义的变量标签使模型输出更漂亮。我有一个变量名称向量 (a)、一个标签向量 (b) 和模型项 (c)。
我必须匹配向量 (a) 和 (c) 并将 (a) 替换为 (b)。我发现这个 library(gsubfn)
中的函数 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, and Hadley's 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)并将(a)替换为(b)?
\S+
模式完全匹配 ecog.psII
和 ecog.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)
如果你不转义特殊字符,你可能会过度匹配(因为 .
匹配任何字符),匹配错误的字符串(如果有量词或其他正则表达式运算符)或者可能发生错误(如果有(
、)
、不成对的 [
等字符)。