Symmetric APIs are easier to use. I was reminded of this when doing some regular expression programming in Python and comparing it to Perl. Perl’s regular expression operators for search and replace are symmetric in a way that their Python counterparts are not.
m/pattern/ for matching and
s/pattern/replacement/ for substitution. Both apply to the first instance of a pattern in a string by default. The
g option following a match or substitute operator causes the command to apply to all instances of the pattern. The
i option after either a match or substitute command causes the pattern to apply in a case-insensitive manner. Matching and substitution are symmetric.
re.search() for matching and
re.sub() for substitution. The search function can only apply to the first instance of a pattern; to match all instances of a pattern, use
re.findall(). The function
re.sub() applies to all instances by default, but it has a
max parameter that can be set to limit the number of instances it applies to. To make a search pattern case-insensitive, pass in
re.IGNORECASE flag. To make a substitution case-insensitive, modify the regular expression itself by adding
In general, I find Python syntax much cleaner than Perl, but regular expressions are implemented more elegantly in Perl.