Regex - Backslashes in Nummer

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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.
Sirius3
User
Beiträge: 18274
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
rogerb
User
Beiträge: 878
Registriert: Dienstag 26. November 2019, 23:24

@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.
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

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
-----
Yet Another Python Developer
Benutzeravatar
__blackjack__
User
Beiträge: 14056
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“Vir, intelligence has nothing to do with politics!” — Londo Mollari
Benutzeravatar
YAPD
User
Beiträge: 120
Registriert: Dienstag 27. Juli 2021, 23:23
Wohnort: Frankfurt am Main

Thread bitte schließen !
-----
Yet Another Python Developer
Antworten