Python regex – r Präfix

Kann jemand erklären, warum Beispiel 1 unten funktioniert, wenn das Präfix nicht verwendet wird? Ich dachte, das r Präfix muss verwendet werden, wenn Fluchtsequenzen verwendet werden? Beispiel 2 und Beispiel 3 zeigen dies ..

# example 1 import re print (re.sub('\s+', ' ', 'hello there there')) # prints 'hello there there' - not expected as r prefix is not used # example 2 import re print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello there there')) # prints 'hello there' - as expected as r prefix is used # example 3 import re print (re.sub('(\b\w+)(\s+\1\b)+', '\1', 'hello there there')) # prints 'hello there there' - as expected as r prefix is not used 

  • Wie man String zurück in eine Liste werfen kann
  • Alphabet Bereich Python
  • Größe des verschachtelten Wörterbuchs und der Liste
  • Flucht doppelte Anführungszeichen für JSON in Python
  • Wie kann ich statischen Text in einen StringVar () einbeziehen und trotzdem auf Variablenänderungen aktualisieren?
  • Warum verursacht der einzelne Backslash-Rohstring in Python einen Syntaxfehler?
  • Löschen von bestimmten Steuerzeichen (\ n \ r \ t) aus einer Zeichenfolge
  • Rreplace - Wie erstelle ich das letzte Vorkommen eines Ausdrucks in einem String?
  • 3 Solutions collect form web for “Python regex – r Präfix”

    Weil ich Escape-Sequenzen nur dann beginnen, wenn sie gültige Escape-Sequenzen sind.

     >>> '\n' '\n' >>> r'\n' '\\n' >>> print '\n' >>> print r'\n' \n >>> '\s' '\s' >>> r'\s' '\\s' >>> print '\s' \s >>> print r'\s' \s 

    Sofern kein 'r' oder 'R' Präfix vorhanden ist, werden Fluchtfolgen in Strings nach Regeln ähnlich wie bei Standard C interpretiert. Die erkannten Escape Sequenzen sind:

     Escape Sequence Meaning Notes \newline Ignored \\ Backslash (\) \' Single quote (') \" Double quote (") \a ASCII Bell (BEL) \b ASCII Backspace (BS) \f ASCII Formfeed (FF) \n ASCII Linefeed (LF) \N{name} Character named name in the Unicode database (Unicode only) \r ASCII Carriage Return (CR) \t ASCII Horizontal Tab (TAB) \uxxxx Character with 16-bit hex value xxxx (Unicode only) \Uxxxxxxxx Character with 32-bit hex value xxxxxxxx (Unicode only) \v ASCII Vertical Tab (VT) \ooo Character with octal value ooo \xhh Character with hex value hh 

    Verlassen Sie sich niemals auf rohe Strings für Pfad-Literale, da rohe Strings einige ziemlich eigenartige innere Arbeiten haben, von denen bekannt ist, dass sie Menschen in den Arsch gebissen haben:

    Wenn ein "r" oder "R" Präfix vorhanden ist, wird ein Zeichen, das einem Backslash folgt, in der Zeichenfolge ohne Änderung enthalten, und alle Backslashs bleiben in der Zeichenfolge. Zum Beispiel besteht das String-Literal r"\n" aus zwei Zeichen: einem Backslash und einem Kleinbuchstaben "n". String-Zitate können mit einem Backslash entkommen, aber der Backslash bleibt im String. Zum Beispiel ist r"\"" ein gültiges String-Literal, das aus zwei Zeichen besteht: ein Backslash und ein doppeltes Zitat, r"\" ist kein gültiges String-Literal (auch ein Rohstring kann nicht in einer ungeraden Anzahl von Backslashs enden). Insbesondere kann ein Rohstring nicht in einem einzigen Backslash enden (da der Backslash dem folgenden Anführungszeichen entgehen würde). Beachten Sie auch, dass ein einziger Backslash, gefolgt von einem Newline, als diese beiden Zeichen als Teil des Strings interpretiert wird, nicht als Linienfortsetzung .

    Um diesen letzten Punkt besser zu verdeutlichen:

     >>> r'\' SyntaxError: EOL while scanning string literal >>> r'\'' "\\'" >>> '\' SyntaxError: EOL while scanning string literal >>> '\'' "'" >>> >>> r'\\' '\\\\' >>> '\\' '\\' >>> print r'\\' \\ >>> print r'\' SyntaxError: EOL while scanning string literal >>> print '\\' \ 

    Das 'r' bedeutet das folgende ist ein "roher String", dh. Backslash-Charaktere werden wörtlich behandelt, anstatt eine spezielle Behandlung des folgenden Charakters zu bedeuten.

    http://docs.python.org/reference/lexical_analysis.html#literals

    So '\n' ist ein einziges Zeilenumfeld
    Und r'\n' ist zwei Zeichen – ein Backslash und der Buchstabe 'n'
    Ein anderer Weg, um es zu schreiben, wäre '\\n' weil der erste Backslash dem zweiten entgeht

    Eine gleichwertige Art, dies zu schreiben

     print (re.sub(r'(\b\w+)(\s+\1\b)+', r'\1', 'hello there there')) 

    Ist

     print (re.sub('(\\b\\w+)(\\s+\\1\\b)+', '\\1', 'hello there there')) 

    Wegen der Art, wie Python Zeichen behandelt, die nicht gültige Escape-Zeichen sind, sind nicht alle diese doppelten Backslashs notwendig – zB '\s'=='\\s' aber das gleiche gilt nicht für '\b' und '\\b' Meine Vorliebe ist explizit und verdoppeln alle Backslashs.

    Nicht alle Sequenzen, die Backslashs beinhalten, sind Escape-Sequenzen. \t und \f sind zum Beispiel aber nicht. In einem Nicht-Roh-String-Literal wird jeder \ , der nicht Teil einer Escape-Sequenz ist, als nur ein anderer \ :

     >>> "\s" '\\s' >>> "\t" '\t' 

    \b ist eine Escape-Sequenz, so dass Beispiel 3 fehlschlägt. (Und ja, manche Leute betrachten dieses Verhalten eher unglücklich.)

    Python ist die beste Programmiersprache der Welt.