#! /usr/bin/env python import re, sys, os def usage(full_progname): usage_str = " Usage: " + full_progname + """ Reads an official class list from stdin with tab-separated lines: last first middle full_name BU-ID login etc Prints on stdout the class grading list with lines: simplified login (no @bu.edu), simplified name (20 chars), BU-ID Before running the program, you may need to run tr \\r \\n < class_list > processed-class-list """ sys.stderr.write(usage_str) sys.exit(1) def parse_line(line): """Assume each name has at least two characters. RETURNS: a hash containing real_name, buid, login For efficiency, compile the rx's outside the function. Earlier class list: parse_rx = r'(.*)\s(\w\d\d-\d\d-\d\d\d\d)\s+(\S+\@\S+)\s' name, buid, login = re.match(parse_rx, line).groups() """ fullname, buid, login = line.split("\t")[3:6] return fullname, buid, login def shorten_name(name, length): """For efficiency, compile the rx's outside the function. """ name = name.lstrip() name = name.rstrip() name = re.sub(r"\s+", " ", name) length_rx = r"^(.{" + `length` + r"}).*$" return re.sub(length_rx, "\g<1>", name) def shorten_login(login): """For efficiency, compile the rx's outside the function. """ return re.sub(r"\@bu\.edu$", "", login) # return re.sub(r"(\w+)\@bu\.edu$", "\g<1>", login) # OK # return re.sub(r"(\w+)\@bu\.edu$", "\1", login) # Does not work "main" if 1 != len(sys.argv): usage(sys.argv[0]) while 1: input_line = sys.stdin.readline() if not input_line: break name, buid, login = parse_line(input_line) name = shorten_name(name, 20) login = shorten_login(login) # Space after login is needed for later hand insertion of scores print "%-9s %-21s %-11s" % (login, name, buid)