Verfasst: Sonntag 23. September 2007, 10:43
Ich hab einige Regular Expressions, die das momentane Verhalten erwarten. Wenn man das also ändert bricht man ziemlich viel bestehenden Code. Wenn muss das eine Flag bekommen.
Seit 2002 Diskussionen rund um die Programmiersprache Python
https://www.python-forum.de/
Hi, siehe hier: http://www.python-forum.de/post-78118.html#78118blackbird hat geschrieben:Ich hab einige Regular Expressions, die das momentane Verhalten erwarten. Wenn man das also ändert bricht man ziemlich viel bestehenden Code. Wenn muss das eine Flag bekommen.
Alles bleibt beim alten nur eine zusätzliche Funktion kommt hinzupoker hat geschrieben: Das Problem könnte man aber umgehen in den man eine neue match Funktion hinzufügt und somit die alten unangetastet lässt (Damit bleibt das bisherige Verhalten gewährleistet).
Die neue match Funktion behandelt die Gruppen dann so wie gefordert.
...
Klar, man kann mit Res vieles machen. Jedoch sind sie nicht immer die Lösung, besonders wenn es komplizierter wird. In den Rubyforen hat WoNaDo mal einen möglicherweise korrekten URL-Mathcer geschrieben. Aber matcht er korrekt? Weiß niemand, denn niemand versteht ihn, weil es eine Übersetzung eines mehrere tausende Zeichen langen ausdrucks aus Perl ist.poker hat geschrieben:@birekenfeld:Ist nicht exakt zutreffend, da Oniguruma eine der Leistungsfähigsten regexp Engines ist und viele Möglichkeiten bietet, die diese Aussage leicht blass aussehen lässt (Hab mal gestern wider seit sehr lange Zeit mit Ruby gespielt und den neusten Snappshot mit Oniguruma getestet ). Man siehe hier. Conditions werden wohl auch bald folgen und hoffentlich viele der Vorschläge von WoNàDo ... Und der nächste schritt wird sicherlich in Zukunft in die Richtung gehen wie ich mir das so gedacht habe.birkenfeld hat geschrieben:Für richtig komplexe Ausdrücke kannst du mit REs eh nichts anfangen.
Das ist eben das was man in Python nicht haben will - eine Verlagerung der Features der Sprache in die Regex-Engine. "There should be one-- and preferably only one --obvious way to do it."blackbird hat geschrieben:<mitsuhiko> Leonidas: 2007 programmiert wonado eh nur noch in turing vollständigen regular expressions
Weil Ruby von der Perl-Seite her geht, und dort Regular-Expressions sehr oft nötig sind. Für die Anwendungsbereiche für die Perl gedacht ist, stimmt das auch. Für Python ist das hingegen nicht der Fall. Python stellt Klarheit vor möglicherweise kryptischen Ausdrücken und die Leute im Python-Forum bevorzugen auch lieber Python-Code als reguläre Ausdrücke.poker hat geschrieben:BTW: Sehe ich das richtig das allgemein kein bedarf nach komplexeren regexp hier herrscht? Warum? Das Ruby Forum scheint da aufgeschlossener zu sein
Da will ich dir auch garnicht widersprechen und hast auch meine volle Zustimmung. Aber in maßen eingesetzt ist das eine Feine Sache. Und warum sollte man nur wegen dem **wenn** so ablehnend reagieren?Leonidas hat geschrieben: Klar, man kann mit Res vieles machen. Jedoch sind sie nicht immer die Lösung, besonders wenn es komplizierter wird.
Ja irgendwann schaft das noch Wolfgang und hat ne Engine dir Wirklich turing vollständigen ist Halte ich persönlich für übertrieben, aber aus seinem Tätigkeitsumfeld absolut nachvollziehbar. Für seine Analysen ist er eben darauf angewiesen; und er ist ja auch ein Meister auf dem Gebiet der REs (Wer oder was ist Fridl!!111!! Frag Wolfgang ).Leonidas hat geschrieben: Um mal ein letztjähriges Zitat aus meinen IRC-Logs zu holen:blackbird hat geschrieben:<mitsuhiko> Leonidas: 2007 programmiert wonado eh nur noch in turing vollständigen regular expressions
O.K. kann ich auch nachvollziehen aus pythonista Sicht, aber finde ich dennoch schade.Leonidas hat geschrieben: Das ist eben das was man in Python nicht haben will - eine Verlagerung der Features der Sprache in die Regex-Engine. "There should be one-- and preferably only one --obvious way to do it."
Naja O.K. dann spare ich mir die Arbeit mit dem neuen Thread und mach mich daran oniguruma für Python zu wrappenLeonidas hat geschrieben: Weil Ruby von der Perl-Seite her geht, und dort Regular-Expressions sehr oft nötig sind. Für die Anwendungsbereiche für die Perl gedacht ist, stimmt das auch. Für Python ist das hingegen nicht der Fall. Python stellt Klarheit vor möglicherweise kryptischen Ausdrücken und die Leute im Python-Forum bevorzugen auch lieber Python-Code als reguläre Ausdrücke.
Das ist sicher eine gute Idee. Wenn sich das dann durchsetzt, spricht ja auch nichts gegen eine Aufnahme in die Standardbibliothek.poker hat geschrieben:Naja O.K. dann spare ich mir die Arbeit mit dem neuen Thread und mach mich daran oniguruma für Python zu wrappenLeonidas hat geschrieben: Weil Ruby von der Perl-Seite her geht, und dort Regular-Expressions sehr oft nötig sind. Für die Anwendungsbereiche für die Perl gedacht ist, stimmt das auch. Für Python ist das hingegen nicht der Fall. Python stellt Klarheit vor möglicherweise kryptischen Ausdrücken und die Leute im Python-Forum bevorzugen auch lieber Python-Code als reguläre Ausdrücke.
Ich hab durch pygments wirklich viel mit komplexen REs zu tun und hatte noch nie das Problem was mit SRE nicht matchen zu können (Ruby Heredocs mal ausgenommen, da braucht es ein Callback). Und die Regexpes von beigesteuerten Code zu verstehen ist manchmal schon gar nicht so einfach. Da braucht man eine Minute bis man was geschnallt hat. Mag sein, dass man mit der Zeit besser wird, aber ich hab da so meine Zweifel...poker hat geschrieben:O.K. kann ich auch nachvollziehen aus pythonista Sicht, aber finde ich dennoch schade.
Hehe. Das hatte ich vor wenigen Wochen mal vor, bin aber nicht dazugekommen das dann auch zu tun. Wäre auf jeden Fall eine praktische Sache.Naja O.K. dann spare ich mir die Arbeit mit dem neuen Thread und mach mich daran oniguruma für Python zu wrappenLeonidas hat geschrieben:Weil Ruby von der Perl-Seite her geht, und dort Regular-Expressions sehr oft nötig sind. Für die Anwendungsbereiche für die Perl gedacht ist, stimmt das auch. Für Python ist das hingegen nicht der Fall. Python stellt Klarheit vor möglicherweise kryptischen Ausdrücken und die Leute im Python-Forum bevorzugen auch lieber Python-Code als reguläre Ausdrücke.
Sorry, aber die Argumentation kann ich nicht nachvollziehen. Es ist ja nicht so, dass die Funktionalität mal da war und herausgenommen wurde. Es ist nicht mal so, dass sie in vergleichbaren Implementierungen da war. Pythons RE sind also in dieser Hinsicht nicht kastriert ggü. denen anderer Sprachen.poker hat geschrieben:So sehe ich das auch mit den REs. Sparsam eingesetzt ist das ein gute Sache und ich sehe nicht ein warum man den Sprachumfang **kastrieren** sollte nur weil man es übertreiben kann?
mfg
birkenfeld hat geschrieben: Das ist sicher eine gute Idee. Wenn sich das dann durchsetzt, spricht ja auch nichts gegen eine Aufnahme in die Standardbibliothek.
Danke euch, das bekräftigt meinen Entschlussblackbird hat geschrieben: Hehe. Das hatte ich vor wenigen Wochen mal vor, bin aber nicht dazugekommen das dann auch zu tun. Wäre auf jeden Fall eine praktische Sache.
Ja das stimmt, ich brauche sogar teilweise **viel** länger. Meine eigenen REs Dokumentiere ich für gewöhnlich, aber auch nur wenn sie wirklich kompliziert sind.blackbird hat geschrieben:Da braucht man eine Minute bis man was geschnallt hat. Mag sein, dass man mit der Zeit besser wird, aber ich hab da so meine Zweifel...
An sowas hatte ich auch mal gedacht, auch wegen der gleichen gründen. Hab aber damals nicht wirklich was schlankes zum wrappen gefunden und fürs schreiben haben dann mein C skills dann doch nicht gereicht.blackbird hat geschrieben: Ich Gegenteil hätte ich lieber eine zweite, etwas limitiertere Regular Expression Engine, die wirklich nur Regular Expressions verarbeitet. Das wäre dann auch *etwas* schneller.
Mein Fehler. ich stimme dir vollkommen zu. Diesmal hab ich das aus einem anderen Kontext (=Oniguruma) betrachtet. Nobody is perfektbirkenfeld hat geschrieben:Sorry, aber die Argumentation kann ich nicht nachvollziehen. Es ist ja nicht so, dass die Funktionalität mal da war und herausgenommen wurde. Es ist nicht mal so, dass sie in vergleichbaren Implementierungen da war. Pythons RE sind also in dieser Hinsicht nicht kastriert ggü. denen anderer Sprachen.
Naja, total trivial vielleicht nicht, aber IMO für Core-Devs, die teilweise komplexeres bewältigen müssen, wären zumindest die Sachen mit den groups nicht so kompliziert. Aber viel mehr Sorgen amchen mir die von BlackJack eingeworfenen Begründungen. Es würde mit Sicherheit "sehr" langsam werden.birkenfeld hat geschrieben: Natürlich kann man das implementieren, ob es so trivial wäre, wie du meinst, weiß ich nicht.
O.K. das akzeptieren ichbirkenfeld hat geschrieben: Generell ist Python halt keine Sprache, in der REs einen großen Stellenwert einnehmen, und deswegen hat sich bisher auch niemand gefunden, der dieses Feature vermisst hätte.
Ich finde Pythons Metaklassen System nützlich, auch wenn es viel Verantwortung mitbringt. Übertreiben sollte man das IMO trotzdem nicht. Hängt aber halt vom Einsatzzweck ab und in der Metaprogrammierung -in Verbindung mit ipython oder IDLE - ungemein nützlich.BlackJack hat geschrieben:@poker: Dein Vergleich mit Klassen hinkt IMHO ein wenig. So eine "kaputte" Klassenhierarchie würde ich mit einem nicht besonders "intelligenten" normalen regulärem Ausdruck vergleichen. Verschachtelte Gruppen sind dann schon eher so etwas wie Metaklassen. Und da stellt sich tatsächlich die Frage ob jemand der noch alle x Sinne beisammen hat Metaklassen a) oft verwendet und/oder b) diese auch noch verschachtelt.
Ich eigentlich nicht. Ist relative leicht verständlich - wenn man den die Elemente mal auswendig gelernt hat - und zähle ich sogar noch zu den simpleren REs. Schau dir mal `RubyLexer` von http://dev.pocoo.org/projects/pygments/ ... s/agile.py an. Sind IMO ein par kompliziertere Ausdrücke dabei. Aber denoch, weist du was das komplizierteste an den Lexer ist? Nicht die REs sondern den von blackbird angesprochenen teil für heredoc. ``heredoc_callback`` ist IMO so ziemlich das komplizierteste daran und ist kein RE. Wen SRE mehr möglichkeiten zu lassen würde, hätte man das sicherlich auch ohne ein Callback machen können.BlackJack hat geschrieben: Ich finde das hier '(\<)\s*((?:(?:[0-9]+)(?:\s*))+)(\>)' jedenfalls schon zu kryptisch
Das warge ich jetzt einmal zu bezweifeln. Es sei denn die Regular Expression engine bringt eine interne Queue mitpoker hat geschrieben:http://dev.pocoo.org/projects/pygments/ ... s/agile.py an. Sind IMO ein par kompliziertere Ausdrücke dabei. Aber denoch, weist du was das komplizierteste an den Lexer ist? Nicht die REs sondern den von blackbird angesprochenen teil für heredoc. ``heredoc_callback`` ist IMO so ziemlich das komplizierteste daran und ist kein RE. Wen SRE mehr möglichkeiten zu lassen würde, hätte man das sicherlich auch ohne ein Callback machen können.
Hmmm....BlackJack hat geschrieben:Quantenphysik ist auch einfach wenn man es kann.
Klar die EBNF ist immer leichter. Aber ich habs mir z.B. angewöhnt, das ich meine REs dokumentiere wenn mein Projekt Final Status erreicht hat. Außerdem kann man ja mit ``re.X`` auch Kommentare einbeziehen, alles schön einruck und auch gleich mit inline comments versehenBlackJack hat geschrieben: Das ist eine simpler Ausdruck, einfach zu schreiben, aber IMHO nicht einfach zu lesen. Ich müsste da jedenfalls wenn ich das nach einem Jahr wieder lese, erstmal im Kopf Klammern parsen und schauen was da zusammengehört und gematcht wird, während eine "EBNF"-Variante wirklich *lesbar* ist.
Ne so meinte ich das nicht. Ob ipython/IDLE welche nutzen k.A.BlackJack hat geschrieben: Metaklassen und ipython/IDLE? Werden da viele Metaklassen verwendet?
Hehe, das mag gut sein, hab den Code auch nicht wirklich weiter analysiert und verstanden (Müsste mal demnächst nen Debuger rüber laufen lassen). Aber, möglich wäre es vielleicht schon, nur noch nicht jetzt WoNaDo hatte da mal ein par nette Vorschläge, das man ähnlich wie in Perl, Funktionen definiert die innerhalb von REs aufgeruffen werden. Seine Überlegungen gingen aber noch weiter als in Perl möglichblackbird hat geschrieben: Das warge ich jetzt einmal zu bezweifeln. Es sei denn die Regular Expression engine bringt eine interne Queue mit
Seltsam. Dabei ist die momentane Ruby Regexp Engine (die, die du wahrscheinlich gesehen hast) viel limitierter als die Python Engine. Kein Unicode, kein Lookbehind, kein Lookahead, keine Named GroupsBlackVivi hat geschrieben:Ich hab mit REs noch nicht alzu viel zu tun gehabt, aber wenn ich welche im Quellcode sehe, kann ich die noch recht einfach deuten. Wenn ich die jedoch bei Perl oder Ruby seh', geht's schon nich mehr ganz so einfach...
Hmpf, vielleicht hab ich mich verguckt oder so. Hab mich mit Ruby nicht alzu doll befasst. Ich zielte eher auf Perl ab...blackbird hat geschrieben:Seltsam. Dabei ist die momentane Ruby Regexp Engine (die, die du wahrscheinlich gesehen hast) viel limitierter als die Python Engine. Kein Unicode, kein Lookbehind, kein Lookahead, keine Named GroupsBlackVivi hat geschrieben:Ich hab mit REs noch nicht alzu viel zu tun gehabt, aber wenn ich welche im Quellcode sehe, kann ich die noch recht einfach deuten. Wenn ich die jedoch bei Perl oder Ruby seh', geht's schon nich mehr ganz so einfach...
Nein!blackbird hat geschrieben: Seltsam. Dabei ist die momentane Ruby Regexp Engine (die, die du wahrscheinlich gesehen hast) viel limitierter als die Python Engine. Kein Unicode, kein Lookbehind, kein Lookahead, keine Named Groups
Ich bezweifle, dass ihm durch Zufall Ruby Code untergekommen ist, der Oniguruma nutzt. Was Oniguruma kann weiß ich selber, die Featureliste brauchst du mir nicht in jedem Post einfügenpoker hat geschrieben:*snip*blackbird hat geschrieben: Seltsam. Dabei ist die momentane Ruby Regexp Engine (die, die du wahrscheinlich gesehen hast) viel limitierter als die Python Engine. Kein Unicode, kein Lookbehind, kein Lookahead, keine Named Groups
BTW: Falls du Ruby 1.8.x meinst: Kannst oniguruma updaten. Gibts ein Binary/source für...