R 正则表达式分解字符串中的参数列表(来自其他语言)
R regex that decompose a list of arguments (from an other language) in a string
我正在寻找一个正则表达式来分解一个字符串,该字符串包含以另一种语言编写的函数的参数,列表形式为 argName = value
.
我的参数字符串的一个实例是:
args <- "arg1, arg2 = {{space}}, arg3 = TRUE, arg4 = {{plot, datG1, arg1 = TRUE}}, arg5 = ga, arg6 = {{bla bla {{plot, datG1, arg1 = TRUE}}}}"
其中 arg1
是一个没有值的参数(按照惯例,这里是 value = NA
),arg2
取值 "{{space}}"
,arg3
取 "TRUE"
,等等
每个值都应作为字符串返回(或 NA
)。特殊形式 {{foo}}
是函数(如 {{space}}
中)或最终包含函数的文本(如 {{bla bla {{plot, datG1, arg1 = TRUE}}}}
中)的约定。我已经有一个代码识别功能和纯文本。我唯一需要的是列出每个函数的参数。
所以在这里,正则表达式应该允许我分解列表中的字符串 args
list(
arg1 = NA,
arg2 = "{{space}}",
arg3 = "TRUE",
arg4 = "{{plot, datG1, arg1 = TRUE}}",
arg5 = "ga",
arg6 = "{{bla bla {{plot, datG1, arg1 = TRUE}}}}"
)
我用来识别函数的正则表达式是"\{\{((?>[^\{\{\}\}]+|(?R))*)\}\}"
您可以使用
args <- "arg1, arg2 = {{space}}, arg3 = TRUE, arg4 = {{plot, datG1, arg1 = TRUE}}, arg5 = ga, arg6 = {{bla bla {{plot, datG1, arg1 = TRUE}}}}"
rx <- "(\w+)(?:\s*=\s*((\{\{((?>(?!\{\{|}})(?s).|(?3))*)}})|\w+))?"
matches <- regmatches(args, gregexec(rx, args, perl=TRUE))
keys <- matches[[1]][2,]
values <- matches[[1]][3,]
values[values==""] <- NA
names(values) <- keys
见regex demo。现在,values
将包含您的数据。您也可以将数据放入 df <- data.frame(params=matches[[1]][2,], values=matches[[1]][3,])
.
的数据框中
详情:
(\w+)
- 第 1 组:一个或多个单词字符
(?:\s*=\s*((\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})|\w+))?
- 一个可选的序列
\s*=\s*
- 包含零个或多个空格的 =
字符
((\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})|\w+)
- 第 2 组:
(\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})
- 第 3 组(用于递归):a {{
,然后是不以 {{
或 [=21= 开头的任何字符的任何零次或多次重复] 字符序列(重复零次或多次),或第 3 组模式,然后是 }}
子字符串
|
- 或
\w+
- 一个或多个单词字符。
我正在寻找一个正则表达式来分解一个字符串,该字符串包含以另一种语言编写的函数的参数,列表形式为 argName = value
.
我的参数字符串的一个实例是:
args <- "arg1, arg2 = {{space}}, arg3 = TRUE, arg4 = {{plot, datG1, arg1 = TRUE}}, arg5 = ga, arg6 = {{bla bla {{plot, datG1, arg1 = TRUE}}}}"
其中 arg1
是一个没有值的参数(按照惯例,这里是 value = NA
),arg2
取值 "{{space}}"
,arg3
取 "TRUE"
,等等
每个值都应作为字符串返回(或 NA
)。特殊形式 {{foo}}
是函数(如 {{space}}
中)或最终包含函数的文本(如 {{bla bla {{plot, datG1, arg1 = TRUE}}}}
中)的约定。我已经有一个代码识别功能和纯文本。我唯一需要的是列出每个函数的参数。
所以在这里,正则表达式应该允许我分解列表中的字符串 args
list(
arg1 = NA,
arg2 = "{{space}}",
arg3 = "TRUE",
arg4 = "{{plot, datG1, arg1 = TRUE}}",
arg5 = "ga",
arg6 = "{{bla bla {{plot, datG1, arg1 = TRUE}}}}"
)
我用来识别函数的正则表达式是"\{\{((?>[^\{\{\}\}]+|(?R))*)\}\}"
您可以使用
args <- "arg1, arg2 = {{space}}, arg3 = TRUE, arg4 = {{plot, datG1, arg1 = TRUE}}, arg5 = ga, arg6 = {{bla bla {{plot, datG1, arg1 = TRUE}}}}"
rx <- "(\w+)(?:\s*=\s*((\{\{((?>(?!\{\{|}})(?s).|(?3))*)}})|\w+))?"
matches <- regmatches(args, gregexec(rx, args, perl=TRUE))
keys <- matches[[1]][2,]
values <- matches[[1]][3,]
values[values==""] <- NA
names(values) <- keys
见regex demo。现在,values
将包含您的数据。您也可以将数据放入 df <- data.frame(params=matches[[1]][2,], values=matches[[1]][3,])
.
详情:
(\w+)
- 第 1 组:一个或多个单词字符(?:\s*=\s*((\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})|\w+))?
- 一个可选的序列\s*=\s*
- 包含零个或多个空格的=
字符((\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})|\w+)
- 第 2 组:(\{\{((?>(?!\{\{|}})(?s).|(?2))*)}})
- 第 3 组(用于递归):a{{
,然后是不以{{
或 [=21= 开头的任何字符的任何零次或多次重复] 字符序列(重复零次或多次),或第 3 组模式,然后是}}
子字符串|
- 或\w+
- 一个或多个单词字符。