I am currently working on a project that requires me to use string manipulation in order to accomplish the goals. One issue I have run into deals with finding certain items in a string while ignoring others. In an effort to do this I am implementing string.gsub() in order to replace the pattern I want to ignore with "substitute" or something similar. The issue is that I want to save what I am replacing with "substitute" for an operation in the future. I thought about using string.find() and string.match() but I don't know how well those will be able to work with the system I am implementing. Here is an example of what I am attempting to do. Input: "3x^2+2x^5-sec(3x+4x)" Parser result: "3x^2+2x^5-substitute" and have a variable that has the value of substitute. Here is my parser so far with no values being returned:

local function parseString(input)
	local s = input:gsub("%(([^()]+)%)", "substitute") -- here is what I don't know how to do
	local str -- this is if there is no symbol
	local firstString -- this is for before the symbol found
	local secondString -- this is for after the symbol found
	local plus = string.find(s, "+")
	local minus = string.find(s, "-")
	if plus and minus then
		if minus > plus then
			firstString = s:sub(1, plus)
			local nextPlus = string.find(s, "+", plus)
			local nextMinus = string.find(s, "-", plus)
			if nextPlus and nextMinus then
				if nextMinus > nextPlus then
					secondString = s:sub(plus, nextPlus) 
				else
					secondString = s:sub(plus, nextMinus) 
				end
			elseif nextPlus then
				secondString = s:sub(plus, nextPlus)
			elseif nextMinus then
				secondString = s:sub(plus, nextMinus)
			else
				secondString = s:sub(plus)		
			end
		else 
			firstString = s:sub(1, minus)		
			local nextPlus = string.find(s, "+", minus)
			local nextMinus = string.find(s, "-", minus)
			if nextPlus and nextMinus then
				if nextMinus > nextPlus then
					secondString = s:sub(minus, nextPlus) 
				else
					secondString = s:sub(minus, nextMinus) 
				end
			elseif nextPlus then
				secondString = s:sub(minus, nextPlus)
			elseif nextMinus then
				secondString = s:sub(minus, nextMinus)
			else
				secondString = s:sub(minus)		
			end
		end
	elseif plus then
		firstString = s:sub(1, plus)
		local nextPlus = string.find(s, "+", plus)
		if nextPlus then
			secondString = s:sub(plus, nextPlus)
		else 
			secondString = s:sub(plus)
		end
	elseif minus then
		firstString = s:sub(1, minus)
		local nextMinus = string.find(s, "-", minus)
		if nextMinus then
			secondString = s:sub(minus, nextMinus)
		else
			secondString = s:sub(minus)
		end		
	else
		str = s				
	end
end

I will deal with what the parser returns and how it recursively works later. I appreciate any help. Thanks!