## Python learning – regular expression

Right now, I am a teaching assistent in University of Oregon (UO) for CIS-122 (Introduction to Programming and Algorithms Using Python). We would like our students to make full use of CScircles of CS department at University of Waterloo (http://cscircles.cemc.uwaterloo.ca/), which is a great online practicing website for Python programming. After quick going thru all these excercises within one week, I decide to post some general solutions and hints for certain topic. For sure, this would be my own ‘Journal’ for studying/teaching this class and hopefully it may provide some help for my students:)

[daveti@aimlab python]\$ cat postalValidateReg.py
#!/bin/env python
# Postal code validation code using regex
# for waterloo online CS program – Chapter 14
# 23SEP2012
# daveti

# Define a function postalValidate(S) which first checks if S represents a postal code which is valid:
# first, delete all spaces;
# the remainder must be of the form ‘L#L#L#’ where L are letters (in either lower or upper case) and # are numbers.
# If S is not a valid postal code, return the boolean False.
# If S is valid, return a version of the same postal code in the nice format L#L#L# where each L is capital.

import re

# Pattern ‘L#L#L#’
# L: characters
# #: digits
def postalValidate(S):
# Need to delete all the spaces within the string
postal = S.strip()
postal2 = ”
for i in range(len(postal)):
if postal[ i] != ‘ ‘:
postal2 += postal[ i]

postalRegStr = ‘[a-zA-Z]+[0-9]+[a-zA-Z]+[0-9]+[a-zA-Z]+[0-9]+’
postalRegObj = re.compile(postalRegStr)
# match() would only try to find the substring matched the pattern
# regardless if the whole string matches the pattern
# Need to use span() to find the start and end indexes
# for the matching to see of the whole string matches…
# NOTE: span() works when match() finds the matching
# Otherwise:
# AttributeError: ‘NoneType’ object has no attribute ‘span’
matchResult = postalRegObj.match(postal2)
if matchResult:
startIdx, endIdx = matchResult.span()
# NOTE: the endIdx is the last matching index plus 1…
if startIdx == 0 and endIdx == len(postal2):
return postal2.upper()
else:
return False
else:
return False

# Main function
inputStr=input()
print ‘Input: ‘ + inputStr
output=postalValidate(inputStr)
print ‘Output: ‘ + str(output)
[daveti@aimlab python]\$