July 2002
Intermediate to advanced
608 pages
15h 46m
English
Credit: Jürgen Hermann, Nick Perkins
Given a set of characters to
keep, you need to build a filtering
functor
(a function-like, callable object). The specific functor you need to
build is one that, applied to any string s,
returns a copy of s that contains only characters
in the set.
The string.maketrans function and
translate method of string objects are fast and
handy for all tasks of this ilk:
import string # Make a reusable string of all characters _allchars = string.maketrans('', '') def makefilter(keep): """ Return a functor that takes a string and returns a partial copy of that string consisting of only the characters in 'keep'. """ # Make a string of all characters that are not in 'keep' delchars = _allchars.translate(_allchars, keep) # Return the functor, binding the two strings as default args return lambda s, a=_allchars, d=delchars: s.translate(a, d) def canonicform(keep): """ Given a string, considered as a set of characters, return the string's characters as a canonic-form string: alphabetized and without duplicates. """ return makefilter(keep)(_allchars) if _ _name_ _ == '_ _main_ _': identifier = makefilter(string.letters + string.digits + '_') print identifier(_allchars)
The key to understanding this recipe lies in the definitions of the
translate
and maketrans functions in the
string module. translate takes a string and replaces each character in it with the corresponding character in the translation ...