R qdap::mgsub,如何用正则表达式传递模式?
R qdap::mgsub, how to pass a pattern with a regular expression?
在上一个问题中 () y 发现 mgsub 确实有一个不需要 br 转义的字符串作为模式。当您想将像 '[%.+%]' 这样的文本替换为文字字符串时,这很好,但是如果您需要传递一个真正的正则表达式,例如:
,那就不好了
library('stringr')
library('qdap')
tt_ori <- 'I have VAR1 and VAR2'
ttl <- list(ttregex='VAR([12])', val="val-\1")
ttl
# OK
stringr::str_replace_all( tt_ori, perl( ttl$ttregex), ttl$val)
# [1] "I have val-1 and val-2"
# OK
mapply(gsub, ttl$ttregex, ttl$val, tt_ori, perl=T)
# [1] "I have val-1 and val-2"
# FAIL
qdap::mgsub(ttl$ttregex, ttl$val, tt_ori)
# [1] "I have VAR1 and VAR2"
如何将正则表达式传递给 mgsub?
[更新]
@BondeDust 是正确的,对于这个过于简单化的示例,这个问题没有意义。想要使用 mgsub 的原因是因为它能够使用模式向量和替换向量与单个字符串并在此字符串中进行所有替换。
例如下一个例子
> tt_ori <- 'I have VAR1 and VAR2 at CARTESIAN'
> ttl <- list( ttregex=c('VAR([12])', 'CARTESIAN')
+ , valregex=c("val-\1", "XY")
+ , tt=c('VAR1', 'VAR2', 'CARTESIAN')
+ , val=c('val-1', 'val-2', 'XY')
+ )
> ttl
$ttregex
[1] "VAR([12])" "CARTESIAN"
$valregex
[1] "val-\1" "XY"
$tt
[1] "VAR1" "VAR2" "CARTESIAN"
$val
[1] "val-1" "val-2" "XY"
# str_replace and gsub return multiple strings with partial substitutions
> stringr::str_replace_all( tt_ori, perl( ttl$ttregex), ttl$valregex)
[1] "I have val-1 and val-2 at CARTESIAN" "I have VAR1 and VAR2 at XY"
> mapply(gsub, ttl$ttregex, ttl$valregex, tt_ori, perl=T)
VAR([12]) CARTESIAN
"I have val-1 and val-2 at CARTESIAN" "I have VAR1 and VAR2 at XY"
# qdap (passing regexes) FAIL
> qdap::mgsub(ttl$ttregex, ttl$valregex, tt_ori)
[1] "I have VAR1 and VAR2 at XY"
# qdap (passing strings) is OK
> qdap::mgsub(ttl$tt, ttl$val, tt_ori)
[1] "I have val-1 and val-2 at XY"
我想尽可能利用正则表达式,而不是编写所有可能的字符串(有时我事先不知道它们)。
将fixed = TRUE
更改为fixed = FALSE
在上一个问题中 (
library('stringr')
library('qdap')
tt_ori <- 'I have VAR1 and VAR2'
ttl <- list(ttregex='VAR([12])', val="val-\1")
ttl
# OK
stringr::str_replace_all( tt_ori, perl( ttl$ttregex), ttl$val)
# [1] "I have val-1 and val-2"
# OK
mapply(gsub, ttl$ttregex, ttl$val, tt_ori, perl=T)
# [1] "I have val-1 and val-2"
# FAIL
qdap::mgsub(ttl$ttregex, ttl$val, tt_ori)
# [1] "I have VAR1 and VAR2"
如何将正则表达式传递给 mgsub?
[更新] @BondeDust 是正确的,对于这个过于简单化的示例,这个问题没有意义。想要使用 mgsub 的原因是因为它能够使用模式向量和替换向量与单个字符串并在此字符串中进行所有替换。
例如下一个例子
> tt_ori <- 'I have VAR1 and VAR2 at CARTESIAN'
> ttl <- list( ttregex=c('VAR([12])', 'CARTESIAN')
+ , valregex=c("val-\1", "XY")
+ , tt=c('VAR1', 'VAR2', 'CARTESIAN')
+ , val=c('val-1', 'val-2', 'XY')
+ )
> ttl
$ttregex
[1] "VAR([12])" "CARTESIAN"
$valregex
[1] "val-\1" "XY"
$tt
[1] "VAR1" "VAR2" "CARTESIAN"
$val
[1] "val-1" "val-2" "XY"
# str_replace and gsub return multiple strings with partial substitutions
> stringr::str_replace_all( tt_ori, perl( ttl$ttregex), ttl$valregex)
[1] "I have val-1 and val-2 at CARTESIAN" "I have VAR1 and VAR2 at XY"
> mapply(gsub, ttl$ttregex, ttl$valregex, tt_ori, perl=T)
VAR([12]) CARTESIAN
"I have val-1 and val-2 at CARTESIAN" "I have VAR1 and VAR2 at XY"
# qdap (passing regexes) FAIL
> qdap::mgsub(ttl$ttregex, ttl$valregex, tt_ori)
[1] "I have VAR1 and VAR2 at XY"
# qdap (passing strings) is OK
> qdap::mgsub(ttl$tt, ttl$val, tt_ori)
[1] "I have val-1 and val-2 at XY"
我想尽可能利用正则表达式,而不是编写所有可能的字符串(有时我事先不知道它们)。
将fixed = TRUE
更改为fixed = FALSE