首页 > 解决方案 > 如何在 R 正则表达式中排除一些模式,有些可能是 2 个或更多字符

问题描述

我正在尝试使用以下正则表达式将字符串标记为标记。

基本上,这个字符串是 R 源代码。因此我想:punct:分成单独的令牌。

但是,我想保留'并且_无论如何,因为它们属于单个令牌。

我的问题是,如何添加更多案例,例如==, <=, <-, &&. 我试过['_==<=<-&&]了,但我认为这不是正确的方法。

strsplit(str, "(\\s+)|(?!['_])(?=[[:punct:]])", perl = TRUE)

标签: rregex

解决方案


最好使用 R 解析器本身而不是自己做(这是一项艰巨的任务,因为您必须基本上重新实现它)。

例如:

x <- parse(text = "x <- c(1, 4)\n x ^ 3 -10 ; outer(1:7, 5:9)\n a <-3 ; a < -3")

str(lapply(as.list(x), as.list))

List of 5
 $ :List of 3
  ..$ : symbol <-
  ..$ : symbol x
  ..$ : language c(1, 4)
 $ :List of 3
  ..$ : symbol -
  ..$ : language x^3
  ..$ : num 10
 $ :List of 3
  ..$ : symbol outer
  ..$ : language 1:7
  ..$ : language 5:9
 $ :List of 3
  ..$ : symbol <-
  ..$ : symbol a
  ..$ : num 3
 $ :List of 3
  ..$ : symbol <
  ..$ : symbol a
  ..$ : language -3

编辑

(根据OP的评论)

str <- "x <- c(1, 4)\n x ^ 3 -10 ; outer(1:7, 5:9)\n a <-3 ; a < -3"

Filter(function(x) x != "", getParseData(parse(text = str))$text)

#  [1] "x"     "<-"    "c"     "("     "1"     ","     "4"    
#  [8] ")"     "x"     "^"     "3"     "-"     "10"    ";"    
# [15] "outer" "("     "1"     ":"     "7"     ","     "5"    
# [22] ":"     "9"     ")"     "a"     "<-"    "3"     ";"    
# [29] "a"     "<"     "-"     "3"

推荐阅读