将角色拆分成多个部分
Spliting the character into parts
我观察到以下字符:
l <- "mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, 2, 0.1), range3 = seq(-2, 2, 0.1)"
在 R 中使用正则表达式,我希望将 l
拆分为以下结构:
[1] "mod" "range1 = seq(-m, n, 0.1)"
[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
不幸的是,我还没有找到解决问题的合适方法。任何人都知道如何获得如此优雅的拆分?
基于 this regex,您可以使用 stringr
、
中的 str_extract_all
library(stringr)
str_extract_all(l, '(?:[^,(]|\([^)]*\))+')
#[[1]]
#[1] "mod" " range1 = seq(-m, n, 0.1)" " range2 = seq(-2, 2, 0.1)" " range3 = seq(-2, 2, 0.1)"
或
trimws(unlist(str_extract_all(l, '(?:[^,(]|\([^)]*\))+')))
#[1] "mod" "range1 = seq(-m, n, 0.1)" "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
这是一个基于 OP post 中显示的 pattern
的 base R
选项。这里我们匹配所有从 (
开始到 )
的字符,跳过它并按 ,
拆分,然后是 space.
strsplit(l, "\([^)]+\)(*SKIP)(*F)|, ", perl = TRUE)[[1]]
#[1] "mod" "range1 = seq(-m, n, 0.1)"
#[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
更新
使用@nicola 的'l'
strsplit(l, ", (?=[[:alnum:]]+\s+\=)", perl = TRUE)[[1]]
#[1] "mod" "range1 = seq(-m, n, 0.1)"
#[3] "range2 = seq(-2, exp(2), 0.1)" "range3 = seq(-2, 2, 0.1)"
和之前的'l'
strsplit(l, ", (?=[[:alnum:]]+\s+\=)", perl = TRUE)[[1]]
#[1] "mod" "range1 = seq(-m, n, 0.1)"
#[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
我真的怀疑你能不能用正则表达式来做。您正在尝试 解析 您的字符串,因此您需要一个通常比正则表达式更强大的解析器。我认为它不够通用,但您可以利用 R 解析器和 alist
class。尝试:
res<-eval(parse(text=paste0("alist(",l,")")))
paste0(names(res),ifelse(names(res)!="","=",""),as.character(res))
#[1] "mod" "range1=seq(-m, n, 0.1)" "range2=seq(-2, 2, 0.1)"
#[4] "range3=seq(-2, 2, 0.1)"
请记住,如果存在嵌套括号,正则表达式建议的解决方案将失败。试试它们和我的:
l<-"mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, exp(2), 0.1), range3 = seq(-2, 2, 0.1)"
理解我的意思。
我观察到以下字符:
l <- "mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, 2, 0.1), range3 = seq(-2, 2, 0.1)"
在 R 中使用正则表达式,我希望将 l
拆分为以下结构:
[1] "mod" "range1 = seq(-m, n, 0.1)"
[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
不幸的是,我还没有找到解决问题的合适方法。任何人都知道如何获得如此优雅的拆分?
基于 this regex,您可以使用 stringr
、
str_extract_all
library(stringr)
str_extract_all(l, '(?:[^,(]|\([^)]*\))+')
#[[1]]
#[1] "mod" " range1 = seq(-m, n, 0.1)" " range2 = seq(-2, 2, 0.1)" " range3 = seq(-2, 2, 0.1)"
或
trimws(unlist(str_extract_all(l, '(?:[^,(]|\([^)]*\))+')))
#[1] "mod" "range1 = seq(-m, n, 0.1)" "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
这是一个基于 OP post 中显示的 pattern
的 base R
选项。这里我们匹配所有从 (
开始到 )
的字符,跳过它并按 ,
拆分,然后是 space.
strsplit(l, "\([^)]+\)(*SKIP)(*F)|, ", perl = TRUE)[[1]]
#[1] "mod" "range1 = seq(-m, n, 0.1)"
#[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
更新
使用@nicola 的'l'
strsplit(l, ", (?=[[:alnum:]]+\s+\=)", perl = TRUE)[[1]]
#[1] "mod" "range1 = seq(-m, n, 0.1)"
#[3] "range2 = seq(-2, exp(2), 0.1)" "range3 = seq(-2, 2, 0.1)"
和之前的'l'
strsplit(l, ", (?=[[:alnum:]]+\s+\=)", perl = TRUE)[[1]]
#[1] "mod" "range1 = seq(-m, n, 0.1)"
#[3] "range2 = seq(-2, 2, 0.1)" "range3 = seq(-2, 2, 0.1)"
我真的怀疑你能不能用正则表达式来做。您正在尝试 解析 您的字符串,因此您需要一个通常比正则表达式更强大的解析器。我认为它不够通用,但您可以利用 R 解析器和 alist
class。尝试:
res<-eval(parse(text=paste0("alist(",l,")")))
paste0(names(res),ifelse(names(res)!="","=",""),as.character(res))
#[1] "mod" "range1=seq(-m, n, 0.1)" "range2=seq(-2, 2, 0.1)"
#[4] "range3=seq(-2, 2, 0.1)"
请记住,如果存在嵌套括号,正则表达式建议的解决方案将失败。试试它们和我的:
l<-"mod, range1 = seq(-m, n, 0.1), range2 = seq(-2, exp(2), 0.1), range3 = seq(-2, 2, 0.1)"
理解我的意思。