\section{Standard Module \sectcode{string}}

\stmodindex{string}

This module defines some constants useful for checking character
classes and some useful string functions.  See the modules
\code{regex} and \code{regsub} for string functions based on regular
expressions.

The constants defined in this module are are:

\renewcommand{\indexsubitem}{(data in module string)}
\begin{datadesc}{digits}
  The string \code{'0123456789'}.
\end{datadesc}

\begin{datadesc}{hexdigits}
  The string \code{'0123456789abcdefABCDEF'}.
\end{datadesc}

\begin{datadesc}{letters}
  The concatenation of the strings \code{lowercase} and
  \code{uppercase} described below.
\end{datadesc}

\begin{datadesc}{lowercase}
  A string containing all the characters that are considered lowercase
  letters.  On most systems this is the string
  \code{'abcdefghijklmnopqrstuvwxyz'}.  Do not change its definition ---
  the effect on the routines \code{upper} and \code{swapcase} is
  undefined.
\end{datadesc}

\begin{datadesc}{octdigits}
  The string \code{'01234567'}.
\end{datadesc}

\begin{datadesc}{uppercase}
  A string containing all the characters that are considered uppercase
  letters.  On most systems this is the string
  \code{'ABCDEFGHIJKLMNOPQRSTUVWXYZ'}.  Do not change its definition ---
  the effect on the routines \code{lower} and \code{swapcase} is
  undefined.
\end{datadesc}

\begin{datadesc}{whitespace}
  A string containing all characters that are considered whitespace.
  On most systems this includes the characters space, tab, linefeed,
  return, formfeed, and vertical tab.  Do not change its definition ---
  the effect on the routines \code{strip} and \code{split} is
  undefined.
\end{datadesc}

The functions defined in this module are:

\renewcommand{\indexsubitem}{(in module string)}

\begin{funcdesc}{atof}{s}
Convert a string to a floating point number.  The string must have
the standard syntax for a floating point literal in Python, optionally
preceded by a sign (\samp{+} or \samp{-}).
\end{funcdesc}

\begin{funcdesc}{atoi}{s}
Convert a string to an integer.  The string must consist of one or more
digits, optionally preceded by a sign (\samp{+} or \samp{-}).
\end{funcdesc}

\begin{funcdesc}{atol}{s}
Convert a string to a long integer.  The string must consist of one
or more digits, optionally preceded by a sign (\samp{+} or \samp{-}).
\end{funcdesc}

\begin{funcdesc}{expandtabs}{s\, tabsize}
Expand tabs in a string, i.e.\ replace them by one or more spaces,
depending on the current column and the given tab size.  The column
number is reset to zero after each newline occurring in the string.
This doesn't understand other non-printing characters or escape
sequences.
\end{funcdesc}

\begin{funcdesc}{find}{s\, sub\optional{\, start}}
Return the lowest index in \var{s} not smaller than \var{start} where the
substring \var{sub} is found.  Return \code{-1} when \var{sub}
does not occur as a substring of \var{s} with index at least \var{start}.
If \var{start} is omitted, it defaults to \code{0}.  If \var{start} is
negative, \code{len(\var{s})} is added.
\end{funcdesc}

\begin{funcdesc}{rfind}{s\, sub\optional{\, start}}
Like \code{find} but find the highest index.
\end{funcdesc}

\begin{funcdesc}{index}{s\, sub\optional{\, start}}
Like \code{find} but raise \code{ValueError} when the substring is
not found.
\end{funcdesc}

\begin{funcdesc}{rindex}{s\, sub\optional{\, start}}
Like \code{rfind} but raise \code{ValueError} when the substring is
not found.
\end{funcdesc}

\begin{funcdesc}{count}{s\, sub\optional{\, i}}
Return the number of (non-overlapping) occurrences of substring
\var{sub} in string \var{s} with index at least \var{i}.
If \var{i} is omitted, it defaults to \code{0}.
\end{funcdesc}

\begin{funcdesc}{lower}{s}
Convert letters to lower case.
\end{funcdesc}

\begin{funcdesc}{split}{s}
Return a list of the whitespace-delimited words of the string
\var{s}.
\end{funcdesc}

\begin{funcdesc}{splitfields}{s\, sep}
  Return a list containing the fields of the string \var{s}, using
  the string \var{sep} as a separator.  The list will have one more
  items than the number of non-overlapping occurrences of the
  separator in the string.  Thus, \code{string.splitfields(\var{s}, '
  ')} is not the same as \code{string.split(\var{s})}, as the latter
  only returns non-empty words.  As a special case,
  \code{splitfields(\var{s}, '')} returns \code{[\var{s}]}, for any string
  \var{s}.  (See also \code{regsub.split()}.)
\end{funcdesc}

\begin{funcdesc}{join}{words}
Concatenate a list or tuple of words with intervening spaces.
\end{funcdesc}

\begin{funcdesc}{joinfields}{words\, sep}
Concatenate a list or tuple of words with intervening separators.
It is always true that
\code{string.joinfields(string.splitfields(\var{t}, \var{sep}), \var{sep})}
equals \var{t}.
\end{funcdesc}

\begin{funcdesc}{strip}{s}
Remove leading and trailing whitespace from the string
\var{s}.
\end{funcdesc}

\begin{funcdesc}{swapcase}{s}
Convert lower case letters to upper case and vice versa.
\end{funcdesc}

\begin{funcdesc}{upper}{s}
Convert letters to upper case.
\end{funcdesc}

\begin{funcdesc}{ljust}{s\, width}
\funcline{rjust}{s\, width}
\funcline{center}{s\, width}
These functions respectively left-justify, right-justify and center a
string in a field of given width.
They return a string that is at least
\var{width}
characters wide, created by padding the string
\var{s}
with spaces until the given width on the right, left or both sides.
The string is never truncated.
\end{funcdesc}

\begin{funcdesc}{zfill}{s\, width}
Pad a numeric string on the left with zero digits until the given
width is reached.  Strings starting with a sign are handled correctly.
\end{funcdesc}

This module is implemented in Python.  Much of its functionality has
been reimplemented in the built-in module \code{strop}.  However, you
should \emph{never} import the latter module directly.  When
\code{string} discovers that \code{strop} exists, it transparently
replaces parts of itself with the implementation from \code{strop}.
After initialization, there is \emph{no} overhead in using
\code{string} instead of \code{strop}.
\bimodindex{strop}
