ELEX 4653 Lab 4

This lab deals with packages, regular expressions and file I/O.

Version 1. May 5, 2019.

Instructions:

  • Modify this notebook by adding the Python code described below.

  • Test your code using the menu item Cell ► Run All

  • Submit the notebook (the .ipynb file) to the appropriate dropbox on the course web site.

Question 1

Import the packages json and datetime.

In [1]:
import json, datetime

Question 2

Import the package cmath into the cm namespace (i.e. as cm). Write a function cfun(x) that returns the value of the expression $e^{jx}+1$. For example, cfun(cm.pi) should return 0.

In [2]:
import cmath as cm
def cfun(x):
    return cm.exp(1j*x)+1

print(cfun(cm.pi))
1.2246467991473532e-16j

Question 3

Download the file words.txt from the web site to the same directory (folder) as this notebook. This is a text file with about 10,000 words in about 1500 lines. The words in each line are separated by spaces. Read the words in the file words.txt into a list of strings named words. The spaces should not be included in the words.

In [3]:
words=[w for s in open('words.txt') for w in s.split()]

Question 4

Set the following string variables to the corresponding regular expressions:

  • re_dog to a regular expression that matches the string dog appearing at the start of a string. For example, it would match 'dogma' but not 'boondoggle'.
  • re_at to a regular expression that matches the string 'at' appearing at the start OR end of a string. For example, it would match 'atom' and 'mat' but not 'batter'
  • re_bvc to a regular expression that matches strings that begin with the letter 'b' followed by any number of vowels (a,e,i,o or u) and ending with one letter that is not a vowel. For example, it would match 'beak' but not 'bury'.

Note: the words list must be set correctly in the previous question for the answers to this question to be verified.

In [4]:
re_dog = r'dog'
re_at = r'^at|at$'
re_bvc = r'^b[aeiou]+[^aeiou]$'  

Question 5

Write a function called writecsv(fn,l) that takes two arguments. The first argument is the name of a file to be written into the current directory. The second is a list of lists. Each of the outer lists is to be written on a separate line with each item in the inner lists separated by commas. For example, writecsv('myfile.csv',[ [1,'b',3], ['a',2,'c'] ]) would create the file myfile.csv with the following lines:

1,b,3
a,2,c

You do not need to put quotes around any of the items or escape embedded commas.

In [5]:
def writecsv(fn,l):
    f=open(fn,'w')
    for s in l:
        print(*s,sep=',',file=f)
    f.close()
In [6]:
# lab validation code; do not modify
def labcheck():

    def checkhash(l,n):
        import hashlib
        # print(hashlib.md5(''.join(l).encode('utf8')).hexdigest())
        assert hashlib.md5(''.join(l).encode('utf8')).hexdigest() == n, \
                'wrong values in list: {} ... {}'.format(l[0],l[-1])

    def q1():
        assert json.dumps and datetime.date

    def q2():
        import random
        n=random.randint(1,10)
        assert cm.pi and abs(cfun(n*cm.pi)-2*(1-n%2))<1e-6

    def q3():
        checkhash(words,'539b36540252cf9d09b7680643f21678')
        
    def q4():
        import re
        for r,h in [(re_dog,'ef2d83005ec707a93d7fac46c54e857b'), 
                    (re_at,'0955cfaf16f61d95ea613104b151f470'), 
                    (re_bvc,'2adddb5156c6217e253293cc2cd1154c')]:
            checkhash([s for s in words if re.search(r,s)],h)
            
    def q5():
        import random
        import hashlib
        l=[[l for l in random.sample('abc123',k=3)] for i in range(3)]
        s=[','.join(s)+'\n' for s in l]
        h=hashlib.md5(''.join(s).encode('utf8')).hexdigest()
        writecsv('lab4q5.csv',l)
        checkhash(open('lab4q5.csv').readlines(),h)
    
    for i,s in ((i,'q%d'%i) for i in range(1,20)):
        if s in locals():
            try:
                locals()[s]()
                print("Question {} OK.".format(i))
            except Exception as e:
                print("Failed check for Question {}: {}".format(i,e))    

labcheck()
Question 1 OK.
Question 2 OK.
Question 3 OK.
Question 4 OK.
Question 5 OK.