[Tutor] findall() (original) (raw)
Dragonfirebane at aol.com Dragonfirebane at aol.com
Sat Jul 3 18:47:56 CEST 2004
- Previous message: [Tutor] A year's calendar to a text file?
- Next message: [Tutor] findall()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
In a message dated 7/3/2004 4:28:13 AM Eastern Standard Time, dyoo at hkn.eecs.berkeley.edu writes:
On Sat, 3 Jul 2004 Dragonfirebane at aol.com wrote:
I'm trying to get the following code to work:
def getlog(activity,type,endtype): log = open("MultivertLog.txt","r") for line in log.readlines(): ac = re.compile(activity) fac = re.findall(ac, line) if fac: print line break else: print "Uh-oh." log.close() logagain = open("MultivertLog.txt","r") ty = re.compile(type) fty = re.findall(ty,line) for line in logagain.readlines(): if not fty: fty = re.findall(ty,line) elif fty: print line break logagain.close() ex = re.compile("\d") fex = re.findall(ex,line) logain = open("MultivertLog.txt","r") for line in logain.readlines(): if not fex: fex = re.findall(ex,line) elif fex: print line break
Hi Dragonfirebane,
The code feels like it's doing too much. Since you're asking us to help debug the code, we have to do everything we can to understand the code; this might involve changing the structure of the program so we don't have to read so much at once.
I hope you don't mind if I split it up into multiple functions? It may help us to see what the code is really doing. Here's a start:
def getlog(activity, type, endtype): tryToPrintActivityLine(activity) tryToPrintTypeLine(type) tryToPrintSomeDigit()
def tryToPrintActivityLine(activity): log = open("Multivert_Log.txt","r") for line in log.readlines(): ac = re.compile(activity) fac = re.findall(ac, line) if fac: print line break else: print "Uh-oh." log.close()
def trytoPrintTypeLine(type): logagain = open("Multivert_Log.txt","r") ty = re.compile(type) fty = re.findall(ty,line) for line in logagain.readlines(): if not fty: fty = re.findall(ty,line) elif fty: print line break logagain.close()
def tryToPrintSomeDigit(): ex = re.compile("\d") fex = re.findall(ex,line) logain = open("Multivert_Log.txt","r") for line in logain.readlines(): if not fex: fex = re.findall(ex,line) elif fex: print line break ######
That's fine. As long as it still does the same thing, it makes little difference.
I'm guessing that the code fits has three distinct blocks of function: 'activity', 'type', and something else that I haven't figured out yet. grin
The reason for the 'endtype' paramater is that activity can be either CALCULATION or CONVERSION. If it is CONVERSION, type is the starting type (Binary, Dec imal, Hexadecimal, or Text) and endtype is the type that the previous type was converted to. However, in CALCULATION there is no need for endtype because once you reach the precision of type, all thats left is the actual manipulation.
Each function does almost the same thing, but with suble differences. In fact, the variation in the three blocks is almost certainly buggy; the third block tries to do a findall() search, but even before it reads in 'logain'.
As far as I can tell, the 'endtype' parameter passed into the original getlog() function is never used, so I'd drop it: it's confusing to take in parameter that aren't used.
There's probably a bug in the third regular expression:
ex = re.compile("\d")Use raw strings when you write regular expression patterns:
ex = re.compile(r"\d")There's an explanation of why backslashes are slightly complicated:
http://www.amk.ca/python/howto/regex/regex.html#SECTION000420000000000000000
The pattern "\d" represents any digit, which is precisely what i want, because that will allow it to pick up only the final manipulation (1 ** 1 = 1 in my example) becuase those are the only times when a digit is present. However, I have also tried using "[0-9]" with as little effect.
If, for example, [readlines():] returns:
"CALCULATION
EXPONENTS 1 ** 1 = 1 ", the code poduces: "CALCULATION "
Ok, so you showed us a "experimental input", an an "experimental output" from the program. But what was the "expected output"? That is, what did you want to see? Pretend that we don't know what it's supposed to do.
Hope this helps! The expected output was:
CALCULATION EXPONENTS 1 ** 1 = 1
because each time a line is printed, the for loop is broken and no more lines are printed, with the exception of the first time (where if fac is not immediately reached, "Uh-oh." is currently printed, merely so i can see that the findall() is working the way i want it to.)
Email: dragonfirebane at aol.com AIM: singingxduck Programming Python for the fun of it. -------------- next part -------------- An HTML attachment was scrubbed... URL: http://mail.python.org/pipermail/tutor/attachments/20040703/ebc3052f/attachment.html
- Previous message: [Tutor] A year's calendar to a text file?
- Next message: [Tutor] findall()
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]