嵌套在R中的Regex嵌套



我正在处理数学表达式列表。我已经确定了6种主要表达方式。我正在使用正则表达式来过滤每个模式,并将类似的表达式写入一个文件,如果任何表达式与任何正则表达式不匹配,则将写入单独的文件(log.txt)。

s1 ="(5.0-50.0)"

s2 ="((5.0-50.0)-15.0)"

s3 ="(15.0 - (5.0-50.0))"

s4 ="((43.0-85.0) (18.0 84.0))"

s5 ="(100.0 - (((5.0-57.0) 92.0))"

s6 ="((((((12.0 89.0))-73.0) - (58.0-90.0))"

我尝试使用nested if-else和ifelse()两者都使用。该代码拾取了第一个模式并将其写入" cressiveType1.txt",然后给出一个错误。当模式与正则匹配不匹配时,它将不会转到其他子句。以下代码仅适用于两种类型的表达式。还有其他方法可以在IF-ELSE条件下使用Regex吗?

expressionList = read.table("expressionList.txt",header = T,sep = "n")
for(i in 1:length(expressionList[,1])){
  currentExpression = as.character(expressionList[i,1])  
  ifelse(grepl("^\(-?\d+\.\d+\s[\+\-\*\/]\s-?\d+\.\d+\)$",currentExpression, perl = T),
         write(currentExpression,file="ExpressionType1.txt",append=TRUE),
    ifelse(grepl("^\(\(-?\d+\.\d+\s[\+\-\*\/]\s-?\d+\.\d+\)\s[\+\-\*\/]\s-?\d+\.\d+\)$",currentExpression, perl = T),
                write(currentExpression,file="ExpressionType2.txt",append=TRUE), write(currentExpression,file="Log.txt",append=TRUE)
                        ))

}

嵌套如果else

  ifelse(grepl("^\(-?\d+\.\d+\s[\+\-\*\/]\s-?\d+\.\d+\)$",
          currentExpression, perl = T) == TRUE){
    write(currentExpression,file="ExpressionType1.txt",append=TRUE)
  } else if(grepl("^\(\(-?\d+\.\d+\s[\+\-\*\/]\s-?\d+\.\d+\)\s[\+\-\*\/]\s-?\d+\.\d+\)$",
          currentExpression, perl = T) == TRUE){ 
    write(currentExpression,file="ExpressionType2.txt",append=TRUE)
  } else{
    write(currentExpression,file="Log.txt",append=TRUE)
  }

ANS [test&ok]< - rep(是,length.out = length(ans))[test& 好的]:更换的长度为零

另外:警告消息:

在rep(是,length.out = length(ans)):

'x'为null,因此结果为null

如果在这里和那里使用一些打印(而不是写入功能),那么您会发现write功能出现问题并消除IFELSE。<<<<<<<<<</p>

便宜的解决方案应该是这样的。

for(i in 1:length(expressionList[,1])){ # i <- 1 
print(i)  
  currentExpression = as.character(expressionList[i,1])  
 enter1 = FALSE 
 enter2 = FALSE 
  if(grepl("^\(-?\d+\.\d+\s[\+\-\*\/]\s-?\d+\.\d+\)$",currentExpression, perl = T)){
         write(currentExpression,file="ExpressionType1.txt",append=TRUE)
    enter1 <- TRUE}
         # print('enter 1'),
         if(grepl("^\(\(-?\d+\.\d+\s[\+\-\*\/]\s-?\d+\.\d+\)\s[\+\-\*\/]\s-?\d+\.\d+\)$",currentExpression, perl = T)){
                write(currentExpression,file="ExpressionType2.txt",append=TRUE)
           enter2 <- TRUE}
  if(enter1 == F & enter2 == F){ write(currentExpression,file="Log.txt",append=TRUE)}
         # print("enter 2"), print('enter 3')

}

最新更新