【发布时间】:2021-03-21 22:03:23
【问题描述】:
我正在尝试创建一个正则表达式,它允许我仅在中间逗号上拆分下面的字符串。
str_1 <- "N(0, 1)"
str_2 <- "N(N(0.1, 1), 1)"
str_3 <- "N(U(0, 1), 1)"
str_4 <- "N(0, T(0, 1))"
str_5 <- "N(N(0, 1), N(0, 1))"
将它们视为分布的参数。现在,我想拆分一下“顶级”的逗号。
一些细节:数字可以是十进制数,也可以是正数和负数。它们将始终在U()、N()、LN() 或T() 内分组,并用逗号分隔。稍后将添加更多分组,因此需要更通用的解决方案或易于扩展。我要做的是在“顶级”逗号处拆分表达式。
现在,str_1 的第一个案例可以直接使用:
unlist(strsplit(str_1, ",", perl = TRUE))
在继续之前,我需要知道我是否有嵌套。我知道如果有嵌套,我将拥有不止一个 N、U、LN 或 T。所以检查一下,我做了(str_2):
length(attr(gregexpr("(N|LN|U|T)", str_2, perl = TRUE)[[1]], "match.length")) > 1
确定我是否有嵌套(可能是一种更简洁的测试方法?),我可以继续计算剩余字符串的拆分。但是,这就是我卡住的地方。鉴于我无法计算逗号,因为 str_2、str_3 和 str_4 的情况会模棱两可。我如何确保我只在中间逗号处拆分?
我希望得到以下输出(因此去掉第一个字母和括号以及最后一个括号)
# str_2
"N(0.1, 1)" "1"
# str_3
"U(0, 1)" "1"
# str_4
"0" "T(0, 1)"
# str_5
"N(0, 1)" "N(0, 1)"
如果可能的话,我想继续使用基础 R 来减少代码的依赖项数量。任何帮助深表感谢。这也可能无法通过正则表达式解决,但需要一种编程方法,可能通过this Java 问题中所建议的递归来解决。
【问题讨论】:
-
这个问题是正式解析器的死铃声,而不是正则表达式。话虽如此,可能有一个正则表达式解决方案。
-
strsplit(substring(str_2, 3, nchar(str_2)-1), ",(?![^()]*\\))", perl=TRUE) -
最好使用词法分析工具(lex)和语法分析器(yacc)。然而,有一些正则表达式可以扫描嵌套结构。也可以使用任何正则表达式引擎进行多次解析:1. 为每个括号注释嵌套级别,2. 扫描相同级别的左括号和右括号,3. 删除嵌套注释。详情请见twiki.org/cgi-bin/view/Blog/BlogEntry201109x3
标签: r regex string recursion pcre