r - 如何在 R 正则表达式中排除一些模式,有些可能是 2 个或更多字符
问题描述
我正在尝试使用以下正则表达式将字符串标记为标记。
基本上,这个字符串是 R 源代码。因此我想:punct:
分成单独的令牌。
但是,我想保留'
并且_
无论如何,因为它们属于单个令牌。
我的问题是,如何添加更多案例,例如==
, <=
, <-
, &&
. 我试过['_==<=<-&&]
了,但我认为这不是正确的方法。
strsplit(str, "(\\s+)|(?!['_])(?=[[:punct:]])", perl = TRUE)
解决方案
最好使用 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"
推荐阅读
- google-analytics-api - 如何使用 nodejs 中的访问令牌从 Google Analytics api v4 获取数据
- dc.js - 使用交叉过滤器在环形图 dc js 中显示多个值总数
- java - 加载 Java xlsx 文件的属性时出错。[错误] 格式错误的 \uxxxx 编码
- java - 是否有范围<?在 JDK 中扩展 Comparable> API
- django - 如何在 django 中使用“add_fields”?
- java - 来自每个表单导航的代号一个新的 gui builder-back 命令
- asp.net-core - rzc discover 退出,代码为 -1073741819
- git - 如何检查 git 历史记录以强制推送?
- python - ctypes 数组中元素上的 Ctypes 指针
- servicenow - 在 SNOW 中更改字段属性