Seite 1 von 1

Regex - Backslashes in Nummer

Verfasst: Montag 9. August 2021, 11:18
von YAPD
Hi Leute,

sorry, dass ich Euch mit so etwas Einfacherem beschäftige,
aber leider habe ich nichts gefunden, was genau zu meiner
Frage passt.

Es geht um die Special Characters bei Regex :

Wenn ich folgenden Code ausführe :

Code: Alles auswählen

phonenumber = "01234\567890"
regex = re.search( r'[\d]+[-\./\\s]' , phonenumber )
print( "Verifier : " , regex ) 
funktioniert es mit allen Zeichen außer mit Backslash :

Code: Alles auswählen

/ : <re.Match object; span=(0, 6), match='01234/'>
- : <re.Match object; span=(0, 6), match='01234-'>
. : <re.Match object; span=(0, 6), match='01234.'>
. : <re.Match object; span=(0, 6), match='01234 '>
\ : None
Hab mir schon ein paar Dokus durchgelesen, wie
https://www.datacamp.com/community/tuto ... _BwE#group

Aber ich komm nicht dahinter.

Könnt ihr mir hier bitte helfen ?

Danke im Voraus !

VG
YAPD

Re: Regex - Backslashes in Nummer

Verfasst: Montag 9. August 2021, 11:49
von rogerb
@YAPD,

'\' hat ja eine besondere Bedeutung in der Regex-Syntax. Wenn du den "Rückwärtsschrägstrich" erkennen willst, muss er duch ein vorgestelltes '\' "escaped" werden.

Es gibt mehrere Möglichkeiten, ich würde es zum Beispiel so machen:

Code: Alles auswählen

pattern = re.compile(r"\d+[\\\.\s/-]\d+")
regex = re.search( pattern , phonenumber )
Zum Ausprobieren gibt es auch viele online Regex Tester.

Re: Regex - Backslashes in Nummer

Verfasst: Montag 9. August 2021, 12:32
von Sirius3
Deine phonenumber enthält ja auch keinen Backslash. Wie soll dann einer gefunden werden?
Die eckigen Klammern um \d sind unnötig und der Backslash vor . hier auch.

Re: Regex - Backslashes in Nummer

Verfasst: Montag 9. August 2021, 13:17
von YAPD
Hi Zusammen,

danke für Eure Antworten :)
Es gibt mehrere Möglichkeiten, ich würde es zum Beispiel so machen:

Code: Alles auswählen

pattern = re.compile(r"\d+[\\\.\s/-]\d+")
regex = re.search( pattern , phonenumber )
Ok danke, das hab ich nun gecheckt.

Das :

Code: Alles auswählen

phonenumber = r"01234\567890"
regex1 = re.search(r'[\d]+[-\./\\s]\d+', phonenumber)
print("Regex I  :" , regex1) 
ist dasselbe wie das :

Code: Alles auswählen

pattern = re.compile(r"\d+[\\\.\s/-]\d+")
regex2 = re.search(pattern, phonenumber)
print("Regex II :" ,regex2)
Wozu der extra Compile ?
Außerdem gibt er mir beim Aufruf ( regex2[ 0 ] ) die Variable ja nur mit einem Backslash zurück,
das habe ich nicht gewusst.

Ansonsten vielen Dank für Eure Hilfe :D

VG
YAPD

Re: Regex - Backslashes in Nummer

Verfasst: Montag 9. August 2021, 13:30
von rogerb
@YAPD,

re.compile() erstellt eine kompilierte Version des Regex-Ausdrucks und speichert diese für spätere Wiederverwendung zwischen.
Will man also einen Regex-Ausdruck mehrmals nutzen, macht es Sinn diesen Ausdruck über re.compile() schon vorzubereiten.

Re: Regex - Backslashes in Nummer

Verfasst: Montag 9. August 2021, 13:56
von YAPD
rogerb hat geschrieben: Montag 9. August 2021, 13:30 @YAPD,

re.compile() erstellt eine kompilierte Version des Regex-Ausdrucks und speichert diese für spätere Wiederverwendung zwischen.
Will man also einen Regex-Ausdruck mehrmals nutzen, macht es Sinn diesen Ausdruck über re.compile() schon vorzubereiten.
Ah OK, vielen Dank ! :)

VG
YAPD

Re: Regex - Backslashes in Nummer

Verfasst: Montag 9. August 2021, 19:16
von __blackjack__
Wobei der Name `pattern` für einen kompilierten regulären Ausdruck ungünstig gewählt ist, denn das ist schon der Name für das Argument das `re,compile()` übergeben wird und das kann man von dem kompilierten regulären Ausdruck auch über das Attribut `pattern` abfragen. Damit hätte man dann für zwei verschiedene Dinge den gleichen Namen, was verwirrend ist.

Ausserdem würde man dann auch eher die `search()`-Methode auf dem kompilierten Objekt aufrufen, statt das an `re.search()` zu übergeben, was dann ja auch nur feststellt, dass es sich bereits um eine kompilierte Regex handelt und darauf dann `search()` aufruft.

Re: Regex - Backslashes in Nummer

Verfasst: Freitag 13. August 2021, 16:18
von YAPD
Thread bitte schließen !