3

我想pat1pat2vec

vec <- c("(and) i.e.", "(and) ie", "(and)ie", "and i.e.", "and ie", "and) i.e.")

pat1 <- "\\(and) i\\.e\\."
pat2 <- "\\(and) ie"

我尝试使用结合这两种模式(pat1|pat2)

# combine the two patterns 
pat1or2 <- paste0("(", pat1, "|", pat2, ")")
# [1] "(\\(and) i\\.e\\.|\\(and) ie)"

grep(pat1, vec, value=TRUE)
# [1] "(and) i.e."

grep(pat2, vec, value=TRUE)
# [1] "(and) ie"

grep(pat1or2, vec, value=TRUE)
# character(0)

显然,我遗漏了一些东西,我无法发现它。
(尝试弄乱 perl 并修复,但不是这样)

你能指出我在结合这两种模式时的错误吗?

4

2 回答 2

5

你忘了反斜杠所有的括号。你的两种模式应该是:

pat1 <- "\\(and\\) i\\.e\\."
pat2 <- "\\(and\\) ie"

在那之后,无论有没有,一切都应该没问题perl = TRUEperl = TRUE使用旧(错误)模式可能会使您走上发现错误的轨道:

grep(pat1, vec, value=TRUE, perl = TRUE)
# Error in grep(pat1, vec, value = TRUE, perl = TRUE) : 
#   invalid regular expression '\(and) i\.e\.'

清楚地表明你有不平衡的括号。

于 2013-07-07T23:00:28.583 回答
2

可以简化如下:

pat1 <- "(and) i.e."
pat2 <- "(and) ie"

ok <- grepl(pat1, vec, fixed = TRUE) | grepl(pat2, vec, fixed = TRUE)  
vec[ ok ]

这可以交替写成这种形式,泛化为两种以上的模式:

pats <- c(pat1, pat2)
ok <- Reduce(function(x, y) x | grepl(y, vec, fixed = TRUE), pats, FALSE)
vec[ ok ]
于 2013-07-07T23:48:35.733 回答