Seite 1 von 2

Re: Benutzereingabe und das Modul re

Verfasst: Samstag 16. Februar 2019, 00:49
von Perlchamp
@ _blackjack_ :
vielleicht ist es bereits zu spät, vielleicht bin ich einfach auch nur zu dumm. Momentan will's einfach nicht in meine Birne.
Wenn ich einen Teststring "67\78" habe und somit nach *einem* \ suche, dann gebe ich als regex (input) "\\" ein und es gibt einen Treffer (siehe unser Script) ...
wenn ich nach einer windows-spezifischen Pfadangabe suche "c:\blablub", dann muß ich *vier* \ nehmen, da der Pfad in Python "c:\\blablub" heißt, weil der *eine* \ durch einen *zweiten*\ maskiert werden muß ... komm, laß gut sein ...
Vielen Dank für deine kostbare Zeit, die du für mich geopfert hast. Vielleicht wird's mit Beispielen einfacher ...

Re: Benutzereingabe und das Modul re

Verfasst: Samstag 16. Februar 2019, 01:20
von __blackjack__
Ich habe doch jedes mal Beispiele geliefert. Und Du schreibst jetzt doch selbst das Du wenn Du nach *einem* \ suchst, im regulären Ausdruck *zwei* \ benötigst.

Re: Benutzereingabe und das Modul re

Verfasst: Samstag 16. Februar 2019, 02:00
von Perlchamp
@ _blackjack_ :
ich kenne leider nicht alle Methoden/Funktionen, die du in deinen Beispielen aufgeführt hast, muß ich erst mal nachlesen ...
ja, wenn ich *einen* \ suche, dann *zwei*\ in regex, das ist klar, aber eben nicht *vier* \ !
*vier* \ in regex, wenn ich *zwei* suche ...

diese Aussage von dir (auf's Wesentliche gekürzt) verwirrt mich eben:
Um *einen* \ zu matchen [...] so: '\\\\' [...]

Re: Benutzereingabe und das Modul re

Verfasst: Samstag 16. Februar 2019, 02:14
von __blackjack__
@Perlchamp: Um einen \ zu matchen braucht der reguläre Ausdruck zwei \ und um zwei \ in einem normalen Zeichenkettenliteral in Python zu schreiben braucht man vier \. Man muss den einen \ einmal für den regulären Ausdruck escapen, und dann die beiden noch mal für den Python-Compiler, macht insgesamt vier. Weil, und hier wiederhole ich mich jetzt nochmal: '\\\\' ist ein Zeichenkettenliteral das eine Zeichenkette mit *zwei* \ beschreibt:

Code: Alles auswählen

In [83]: len('\\\\')
Out[83]: 2

In [84]: print('\\\\')
\\
Und jetzt sag bitte nicht das Du `len()` und `print()` nicht kennst.

Re: Benutzereingabe und das Modul re

Verfasst: Samstag 16. Februar 2019, 02:29
von Perlchamp
@ _blackjack_ :
ja, nee, len() und print() kenne ich bereits ;-)
das Prinzip ist generell klar :
die doppelte Anzahl des zu matchenden Strings in der regex, kein Thema, war mir immer klar.
Der Hase liegt woanders begraben (das war auch die ganze Zeit das Mistverständnis; dass ich nie den Compiler in Betracht gezogen habe, was jedoch für dich selbstverständlich war.) :
warum muß ich das nochmals für den Compiler doppeln (also dann insgesamt zweimal doppeln) ?
ich habe doch den Teststring (mit *einem* \) und meine regex (mit *zwei* \). Findet doch das Match durch 're.search()' und gut ist. Warum muß ich also nochmals für den Compiler die regex maskieren (=> *vier* \) ?
Wo liegt mein Denkfehler ?
Unser Script liefert doch ab !

Re: Benutzereingabe und das Modul re

Verfasst: Samstag 16. Februar 2019, 08:50
von __blackjack__
@Perlchamp: In dem Skript wird der reguläre Ausdruck ja auch vom Benutzer eingegeben und steht nicht im Quelltext. Also muss er auch nicht am Python-Compiler vorbei.

Re: Benutzereingabe und das Modul re

Verfasst: Samstag 16. Februar 2019, 13:12
von Perlchamp
@ _blackjack_
jetzt wird ein Schuh draus, verstehe ... ok damit ist der Groschen endgültig gefallen :-)
ich danke dir nochmals für deine Geduld und deine Zeit.