473,387 Members | 1,465 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,387 software developers and data experts.

String function parameter replacing

Hi guys!

I would like to ask your help. I have started learning python, and there are a task that I can not figure out how to complete. So here it is.

We have a input.txt file containing the next 4 rows:

Expand|Select|Wrap|Line Numbers
  1. f(x, 3*y) * 54 = 64 / (7 * x) + f(2*x, y-6)
  2.  
  3. x + f(21*y, x - 32/y) + 4 = f(21 ,y)
  4.  
  5. 86 - f(7 + x*10, y+ 232) = f(12*x-4, 2*y-61)*32 + f(2, x)
  6.  
  7. 65 - 3* y = f(2*y/33 , x + 5)
The task is to change the "f" function and it's 2 parameters into dividing. There can be different amount of spaces between the two parameters. For example f(2, 5) is the same as f(2 , 5) and should be (2 / 5) with exactly one space before and after the divide mark after the running of the code. Also, if one of the parameters are a multiplification or a divide, the parameter must go into bracket. For example: f(3, 5*7) should become (3 / (5*7)). And there could be any number of function in one row. So the output should look like this:

Expand|Select|Wrap|Line Numbers
  1. (x / (3*y)) * 54 = 64 / (7 * x) + ((2*x) / (y-6))
  2.  
  3. x + ((21*y) / (x - 32/y)) + 4 = (21 / y)
  4.  
  5. 86 - ((7 + x*10) / (y+ 232)) = ((12*x-4) / (2*y-61))*32 + (2 / x)
  6.  
  7. 65 - 3* y = ((2*y/33) / (x + 5))
I would be very happy if anyone could help me.

Thank you in advance,
David
May 12 '14 #1

✓ answered by bvdet

Actually, I did not need to use start and end variables. That was causing the missed third match. The search method will find the first occurrence of the match string. After redefining the string using the previous match, the next match will be found. I modified a few other things so it would work.
Expand|Select|Wrap|Line Numbers
  1. import re
  2.  
  3. s = "86 - f(7 + x*10, y+ 232) = f(12*x-4, 2*y-61)*32 + f(2, x) - 12*6"
  4. patt = re.compile(r"(f\((.[^)]+)\))")
  5.  
  6. while True:
  7.     m = patt.search(s)
  8.     if m:
  9.         s1 = m.group(1)
  10.         s2 = m.group(2)
  11.         a,b = [ss.strip() for ss in s2.split(",")]
  12.         if "+" in b or "-" in b or "*" in b or "/" in b:
  13.             b = "(%s)" % b     
  14.         if "+" in a or "-" in a or "*" in a or "/" in a:
  15.             a = "(%s)" % a 
  16.         s = s.replace(s1, "(%s / %s)" % (a,b), 1)
  17.     else:
  18.         break
  19. print s
Hopefully inline code will display properly:
patt = re.compile(r'(f\((.[^)]+)\))')

4 1652
bvdet
2,851 Expert Mod 2GB
Here's a simplified version using a re solution showing unconditional formatting of the replacement string. I'll leave it up to you to finalize the formatting.
Expand|Select|Wrap|Line Numbers
  1. import re
  2.  
  3. s = "86 - f(7 + x*10, y+ 232) = f(12*x-4, 2*y-61)*32 + f(2, x) - 12*6"
  4. patt = re.compile(r'(f\((.[^)]+)\))')
  5.  
  6. start = 0
  7. end = len(s)
  8. while True:
  9.     m = patt.search(s, start, end)
  10.     if m:
  11.         s1 = m.group(1)
  12.         s2 = m.group(2)
  13.         a,b = [ss.strip() for ss in s2.split(",")]
  14.         s = s.replace(s1, "(%s) / (%s)" % (a,b), 1)
  15.         start = m.end()+1
  16.     else:
  17.         break
Resulting string:
Expand|Select|Wrap|Line Numbers
  1. >>> s
  2. '86 - (7 + x*10) / (y+ 232) = (12*x-4) / (2*y-61)*32 + (2) / (x) - 12*6'
May 12 '14 #2
Thank you very much, you helped me out quite well. Now I get it more or less. This is kinda difficult to decode:
Expand|Select|Wrap|Line Numbers
  1. patt = re.compile(r'(f\((.[^)]+)\))')
.

However, I tried to give it some conditions, like if the left or right part of the f() call contains "+, -, *, /" marks, then replace it with a bracketed one. It only works for the first two call function but it leaves out the third one. I don't know why, I tried to print every useful information, and it looks like the search just can't find the 3rd one no matter where it starts. Could you help me out at this one as well? I'm sorry for being this problematic, but I really would like to understand how it works. Thank you in advance. Here's the code:

Expand|Select|Wrap|Line Numbers
  1. import re
  2.  
  3. s = "86 - f(7 + x*10, y+ 232) = f(12*x-4, 2*y-61)*32 + f(2, x) - 12*6"
  4. patt = re.compile(r'(f\((.[^)]+)\))')
  5.  
  6. start = 0
  7. end = len(s)
  8. while True:
  9.     m = patt.search(s, start, end)
  10.     if m:
  11.         s1 = m.group(1)
  12.         s2 = m.group(2)
  13.         a,b = [ss.strip() for ss in s2.split(",")]
  14.     if "+" in b or "-" in b or "*" in b or "/" in b:
  15.         b = b.replace(b, "(%s)" % b)
  16.     else:
  17.         print "Nothing.";
  18.  
  19.     if "+" in a or "-" in a or "*" in a or "/" in a:
  20.         a = a.replace(a, "(%s)" % a)
  21.     else:
  22.         print "Nothing.";
  23.  
  24.         s = s.replace(s1, "(%s / %s)" % (a,b), 1)
  25.         start = m.end()+1
  26.     else:
  27.         break
  28.  
  29. print s
May 13 '14 #3
bvdet
2,851 Expert Mod 2GB
Actually, I did not need to use start and end variables. That was causing the missed third match. The search method will find the first occurrence of the match string. After redefining the string using the previous match, the next match will be found. I modified a few other things so it would work.
Expand|Select|Wrap|Line Numbers
  1. import re
  2.  
  3. s = "86 - f(7 + x*10, y+ 232) = f(12*x-4, 2*y-61)*32 + f(2, x) - 12*6"
  4. patt = re.compile(r"(f\((.[^)]+)\))")
  5.  
  6. while True:
  7.     m = patt.search(s)
  8.     if m:
  9.         s1 = m.group(1)
  10.         s2 = m.group(2)
  11.         a,b = [ss.strip() for ss in s2.split(",")]
  12.         if "+" in b or "-" in b or "*" in b or "/" in b:
  13.             b = "(%s)" % b     
  14.         if "+" in a or "-" in a or "*" in a or "/" in a:
  15.             a = "(%s)" % a 
  16.         s = s.replace(s1, "(%s / %s)" % (a,b), 1)
  17.     else:
  18.         break
  19. print s
Hopefully inline code will display properly:
patt = re.compile(r'(f\((.[^)]+)\))')
May 13 '14 #4
bvdet
2,851 Expert Mod 2GB
Here's an attempt to explain the re pattern
r'(f\(([^)]+)\))'
Open parenthesis - start group 1
f - Match "f" character
backslash+( - Match "(" character
Open parenthesis - start group 2
[^)] - Match characters that are not ")"
+ - Greedily matches one or more of the previous expression
Close parenthesis - end group 2
backslash+) - Match ")" character
Close parenthesis - end group 1
May 13 '14 #5

Sign in to post your reply or Sign up for a free account.

Similar topics

6
by: pablo | last post by:
Dear Newsgroupers, The 'main' page contains a call to a function in an included file. This function puts a html-form on the screen. Before the form gets posted (to the 'main' page) some prior...
8
by: Börni | last post by:
Hi, Is there a way to provide a default for a function parameter. i tried function func (type, message, obj = "message") but it doesn't seem to work. It seems a bit ugly to make an if/else...
5
by: Rolf Wester | last post by:
Hi, I want to pass a C-function as a function parameter but I don't know how to that correctly. In the example below how would I have to declare the function argument in the my_sort function...
15
by: Daniel Rudy | last post by:
Hello, Consider the following code: /* resolve_hostname this resolves the hostname into an ip address. */ static void resolve_hostname(char result, const char hostname, const char server) {
2
by: Matthew Louden | last post by:
When I pass an array as a function parameter, it yields the following compile error. Any ideas?? However, if I create a variable that holds an array, and pass that variable to the function...
2
by: Glenn Lerner | last post by:
If I pass a reference type (such as DataSet) to a function, I'm assuming only a reference is passed (not a copy). So there is no need to declare function parameter as ref for those types? Example:...
2
by: Nelson Smith | last post by:
Is it possible to pass array as function parameter. I am using .Net Framework 1.1. If so how? Thanks, Nelson
5
by: Joe | last post by:
Hi, I like to know what do you specify in the function parameter (in the function implementation) if you want the string that you pass in with the function call to be changed while its in the...
16
by: hzmonte | last post by:
Correct me if I am wrong, declaring formal parameters of functions as const, if they should not be/is not changed, has 2 benefits; 1. It tells the program that calls this function that the...
2
by: othellomy | last post by:
select left('Hello World /Ok',charindex('/','Hello World /Ok')-1) Hello World That works fine. However I got an error message: select left('Hello World Ok',charindex('/','Hello World Ok')-1)...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
If we have dozens or hundreds of excel to import into the database, if we use the excel import function provided by database editors such as navicat, it will be extremely tedious and time-consuming...
0
by: emmanuelkatto | last post by:
Hi All, I am Emmanuel katto from Uganda. I want to ask what challenges you've faced while migrating a website to cloud. Please let me know. Thanks! Emmanuel
1
by: nemocccc | last post by:
hello, everyone, I want to develop a software for my android phone for daily needs, any suggestions?
1
by: Sonnysonu | last post by:
This is the data of csv file 1 2 3 1 2 3 1 2 3 1 2 3 2 3 2 3 3 the lengths should be different i have to store the data by column-wise with in the specific length. suppose the i have to...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...
0
by: Hystou | last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
0
jinu1996
by: jinu1996 | last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.