Python String (str)                         (C) 2020-2025 T.Birnthaler OSTC GmbH
===================

Doku --> docs.python.org/3/library/stdtypes.html#str
         docs.python.org/3/library/stdtypes.html#string-methods

Strings in Python sind seit Python 3.0 Sequenzen von Unicode-Einzelzeichen
codiert im Format UTF-8, d.h. jedes Zeichen belegt 1-4 Bytes. In Python 2.X
wurden Strings noch durch Einzelbyte-Zeichen dargestellt (z.B. ISO-8859).

Die String-Quotierungen "..." und '...' haben die exakt gleiche Bedeutung,
Python selbst stellt per repr() erzeugte Strings in der Form '...' dar.

  "hallo welt"    # Unicode-String (in P3 automatisch)
  u"hallo welt"   # Unicode-String (in P2 notwendig, in P3 Standard)
  U"hallo welt"   # Unicode-String (in P2 notwendig, in P3 Standard)
  ""              # Leerer String

Folgende LESENDEN Sequenz-Operationen werden von Strings unterstützt (R, S, T,
X sind Strings, I, N sind Ganzzahlen, C ist ein Zeichen, D ist ein Dictionary,
L ist eine Liste von Strings, ENC ist ein Encoding):

ACHTUNG: String S bleibt UNVERÄNDERT, neuer String kommt als Ergebnis zurück.
         (ergibt sich aus der im-mutable Eigenschaft von Strings).

+-----------------------+------------------------------------------------------+
| Operation             | Bedeutung                                            |
+-----------------------+------------------------------------------------------+
| for E in S: ...       | Alle Zeichen E von S nach Index geordnet durchlaufen |
+-----------------------+------------------------------------------------------+
| T in S                | Substring T in S enthalten                           |
| T not in S            | Substring T nicht in S enthalten                     |
+-----------------------+------------------------------------------------------+
| S + T                 | Verkettung von S und T                               |
| S * N   N * S         | String S N-mal vervielfachen                         |
+-----------------------+------------------------------------------------------+
| S[I]                  | Zeichen mit Index I (Start bei 0)                    |
| S[I:J]                | Substring von Index I bis J-1 (mit Schrittweite 1)   |
| S[I:J:K]              | Substring von Index I bis J-1 mit Schrittweite K     |
+-----------------------+------------------------------------------------------+
| S == T                | Strings S und T gleich?                              |
| S != T                | Strings S und T ungleich?                            |
+-----------------------+------------------------------------------------------+
| S < T                 | S alphabetisch kleiner T          (lexikografisch!)  | Unicode!
| S <= T                | S alphabetisch kleiner gleich T   (lexikografisch!)  | Unicode!
| S > T                 | S alphabetisch größer T           (lexikografisch!)  | Unicode!
| S >= T                | S alphabetisch größer gleich T    (lexikografisch!)  | Unicode!
+-----------------------+------------------------------------------------------+
| len(S)                | Länge von S (Anzahl Zeichen)                         |
+-----------------------+------------------------------------------------------+
| min(S)                | Kleinstes Zeichen in S (gemäß Vergleich "<")         |
| max(S)                | Größtes   Zeichen in S (gemäß Vergleich "<")         |
+-----------------------+------------------------------------------------------+
| reversed(S)           | Zeichen in umgekehrter Reihenfolge (Iterator)        |
| sorted(S,key,         | Sortierte Liste der Zeichen (gemäß Vergleich "<")    |
|          reverse)     | (key=MAPFUNC, reverse=True --> absteigend)           |
+-----------------------+------------------------------------------------------+

Folgende LESENDEN String-Funktionen sind für Strings verfügbar:

ACHTUNG: String S bleibt UNVERÄNDERT, neuer String kommt als Ergebnis zurück
         (ergibt sich aus der im-mutable Eigenschaft von Strings).

+-----------------------+------------------------------------------------------+
| Funktion              | Bedeutung                                            |
+-----------------------+------------------------------------------------------+
| S.lower()           U | Kleinschreibung                                      |
| S.upper()           U | Großschreibung                                       |
| S.swapcase()        U | Groß/Kleinschreibung vertauschen                     |
| S.capitalize()      U | 1. Buchstaben groß schreiben, Rest klein             |
| S.title()           U | Alle Worte beginnen mit Großbuchstaben, Rest klein   |
| S.casefold()        U | Aggressiveres lower() (z.B. "ß" --> "ss")        3.3 |
+-----------------------+------------------------------------------------------+
| S.startswith(T[,I[,N]]| Beginnt mit T (ab Position I, Länge N)               |
| S.endswith(T[,I[,N]]  | Endet mit T (ab Position I, Länge N)                 |
+-----------------------+------------------------------------------------------+
| S.count(T[,I[,N]])    | Anzahl Vorkommen von T (ab Position I, Länge N)      |
| S.find(T[,I[,N]])     | Von links Treffer-Index von T finden (-1 falls nein) |
| S.index(T[,I[,N]])    | Wie S.find(), ValueError statt -1 falls kein Treffer |
| S.rfind(T[,I[,N]])    | Von rechts Treffer-Index von T finden (-1 falls nein)|
| S.rindex(T[,I[,N]])   | Wie S.rfind(), ValueError statt -1 falls kein Treffer|
+-----------------------+------------------------------------------------------+
| S.isspace()         U | Besteht nur aus Leerraum (mind. 1)                   |
| S.isascii()           | Besteht nur aus ASCII-Zeichen 0-127 (oder leer)      |
| S.isidentifier()      | Gültiger Python-Bezeichner (--> keyword.iskeyword()) |
| S.isprintable()     U | Alle Zeichen in repr() ausdruckbar (oder leer)       |
+-----------------------+------------------------------------------------------+
| S.isalpha()         U | Besteht nur aus Buchstaben (mind. 1)                 |
| S.isdecimal()       U | Besteht nur aus Ziffern (Dezimalziffern, mind. 1)    | 1
| S.isdigit()         U | Besteht nur aus Ziffern (Fraction/Superscript, m. 1) | 2
| S.isnumeric()       U | Besteht nur aus Ziffern (römische, mind. 1)          | 3
| S.isalnum()         U | Besteht nur aus Buchstaben oder Ziffern (mind. 1)    |
|                       | (isalpha + isdecimal + isdigit + isnumeric)          |
+-----------------------+------------------------------------------------------+
| S.islower()         U | Besteht nur aus Kleinbuchstaben (mind. 1)            |
| S.isupper()         U | Besteht nur aus Großbuchstaben (mind. 1)             |
| S.istitle()         U | Alle Worte beginnen mit Großbuchstaben, Rest klein   |
+-----------------------+------------------------------------------------------+
| S.removeprefix(T)     | Falls S mit T beginnt, T entfernen               3.9 |
| S.removesuffix(T)     | Falls S mit T endet, T entfernen                 3.9 |
+-----------------------+------------------------------------------------------+
| S.lstrip([T])         | Beliebig viel Leerraum/Zeichen T links entfernen     |
| S.rstrip([T])         | Beliebig viel Leerraum/Zeichen T rechts entfernen    |
| S.strip([T])          | Beliebig viel Leerraum/Zeichen T links+rechts entf.  |
+-----------------------+------------------------------------------------------+
| S.center(N[,C])       | Zentriert in Breite N mit Füllz. C (STD: Leerz.)     |
| S.ljust(N[,C])        | Linksbündig in Breite N mit Füllz. C (STD: Leerz.)   |
| S.rjust(N[,C])        | Rechtsbündig in Breite N mit Füllz. C (STD: Leerz.)  |
| S.zfill(N)            | Links in Breite N mit "0" auffüllen                  |
+-----------------------+------------------------------------------------------+
| S.join(L)             | Verketten der Elemente in L getrennt durch S         |
| S.split(T[,MAX])      | Zerlegen von links anhand T (alle/MAX)               |
| S.rsplit(T[,MAX])     | Zerlegen von rechts anhand T (alle/MAX)              |
| S.splitlines(         | Zerlegen anhand Zeilentrenner \n \r \r\n \f \v ...   |
|       keepends=False) |   (Zeilenenden entfernen oder erhalten)              |
+-----------------------+------------------------------------------------------+
| S.partition(T)        | Zerlegen in (Head, T, Tail) am ersten T von links    |
| S.rpartition(T)       | Zerlegen in (Head, T, Tail) am ersten T von rechts   |
+-----------------------+------------------------------------------------------+
| S.replace(T,R[,MAX])  | T durch R ersetzen (alle oder Anzahl MAX)            |
| S.translate(D)        | Zeichen-Key in D durch Value ersetzen oder löschen   |
| S.make_trans(D)       | (Übersetzungs-Tabelle für translate() erstellen)     |
| S.make_trans(S,T[,X]) | (Übersetzungs-Tabelle für translate() erstellen)     |
| S.expandtabs(N)       | Tabulatoren (Breite N) durch Leerzeichen ersetzen    |
+-----------------------+------------------------------------------------------+
| S.decode(ENC,ERR)     | Decodieren gemäß Codierung ENC                       |
| S.encode(ENC,ERR)     | Codieren gemäß Codierung ENC                         |
+-----------------------+------------------------------------------------------+
| F"S"                  | {var}-Platzhalter in S ersetzen durch Wert von var   |
| S.format(*args,**kwa) | {}-Platzhalter in S ersetzen durch Werte in (...)    |
| S.format_map(...)     | Analog, aber **kwargs wird nicht in dict kopiert     |
| S % (...)             | %-Platzhalter in S ersetzen durch Werte in (...)     |
+-----------------------+------------------------------------------------------+

* HINWEIS: Kürzel "U" --> durch den Unicode-Standard definiert.

* func(T[,I[,N]]) steht für: von Index I (Std: 0) bis VOR Index N (Std: len(T))
  (,I,N oder ,N können auch fehlen).

* MAX steht für Anzahl Stücke MAXIMAL, sonst ALLE Stücke erzeugen/ersetzen.

* ERR kann "strict", "ignore", "replace" und "xmlcharrefreplace" sein.  TODO

* Unterschied --> Mostly about Unicode classification
  isdecimal() <= isdigit() <= isnumeric()
    True           True          True     # 10-System Ziffern:      "038"  "੦੩੮"  "038"
    False          True          True     # Fractions/Superscripts: "⁰³⁸", "🄀⒊⒏", "⓪③⑧""
    False          False         True     # Römische Zahlen:        "↉⅛⅘", "ⅠⅢⅧ", "⑩⑬㊿", "壹貳參"
    False          False         False    # Alles andere            "abc", "38.0", "-38"

* split() und rsplit() ohne Argument zerlegen den String an WHITESPACE
  (führende und abschließende Whitespaces werden dabei ignoriert).

* Leerraum (WHITESPACE) ist eine beliebig lange Folge folgender Zeichen:

    +-----+----+------------------------+---------------------------------+
    | \t  |  9 | Horizontaler Tabulator | Zur nächsten Tabulator-Position |
    | \n  | 10 | Newline                | Zu nächster Zeile               |
    | \v  | 11 | Vertikaler Tabulator   |
    | \f  | 12 | Form Feed              | Seitenvorschub (Drucker)        |
    | \r  | 13 | Carriage Return        | Zum Zeilenanfang                |
    | " " | 32 | Space                  | Leerzeichen                     |
    +-----+----+------------------------+---------------------------------+