Seite 1 von 1

regulärer ausdruck: umstellung auf camel schreibweise

Verfasst: Montag 24. April 2006, 11:40
von aldana
hi,

ich bräuchte einen regulären ausdruck, der z.b. foo_bar in fooBar umwandelt (für meine php skripte). php ist in erster linie ein template websprache und soll dafür nicht eingesetzt werden. python ist mir für solche sachen lieber :)

also sowas in der richtung:

Code: Alles auswählen

import re
patternUnderscore=re.compile(r'_(\w)')
camelText=patternUnderscore.sub(r'\1')
das problem von camelText ist jetzt, dass zwar die unterstriche weg sind, der folgende buchstabe aber klein bleibt. gibt es da eine anweisung für \1, die alle buchstaben in grosse umwandelt?

danke.

Verfasst: Montag 24. April 2006, 14:07
von mitsuhiko
quick and ugly:

Code: Alles auswählen

def make_smallcase(func_name):
     return ''.join((pos > 0) and char.title() or char.lower()
                    for pos, char in enumerate(func_name.split('_')))
php ist in erster linie ein template websprache und soll dafür nicht eingesetzt werden
IMHO sollte php für nichts eingesetzt werden, außer für kleine webseiten

Verfasst: Montag 24. April 2006, 18:37
von murph
Darf ich als n00b fragen, wieso der Skript dreckig sein soll?

PHP ist wirklich für größere Geschichten sinnlos, weil man damit den Server lahmlegen kann, falls ein Fehler ein einr Funktion ist oder eine Rechenaufgabe zu lange dauert, wie SUDOKU oder ähnliches...

Verfasst: Montag 24. April 2006, 19:07
von icepacker
murph hat geschrieben:Darf ich als n00b fragen, wieso der Skript dreckig sein soll?
Also laut blackbird ist das Script hässlich :wink:
Und das wahrscheinlich, weil sich zumindestens mir die
Funktionsweise nicht sofort offenbart.

edit:
PHP ist wirklich für größere Geschichten sinnlos, weil man damit den Server lahmlegen kann, falls ein Fehler ein einr Funktion ist oder eine Rechenaufgabe zu lange dauert, wie SUDOKU oder ähnliches...
Also wegen einem Fehler stürzt der Server im Normalfall nicht ab, es seidenn
es ist wirklich ein kurioser Bug in der Sprache.
Und wenn eine Rechenaufgabe zu lange dauert sollte der Webserver den Prozess
eigentlich beenden können?!

Verfasst: Montag 24. April 2006, 20:47
von Leonidas
murph hat geschrieben:Darf ich als n00b fragen, wieso der Skript dreckig sein soll?
Die Funktion ist etwas unübersichtlich. Erst wird der Input-Text an den Bodenstrichen aufgeteilt, dann wird der erste Buchstabe groß geschrieben, wnn er nicht an der Position null steht (alo erster Buchstabe). Danach werden alle diese rausgekommenen Strings verklebt. Und das alles mit Generator Expressions.

Also ich finds gut, auch wenn ichs anders (länger) machen würde. Demonstriert aber die Fähigkeiten Pythons sehr gut. Regular Expressions braucht man in dem Kontext gar nicht.

Verfasst: Dienstag 25. April 2006, 09:29
von murph
Alle Programme, die nicht Vorbildmäßig wie eine Musterlösung aussehen, sind folglich hässlich/dreclig?

Verfasst: Dienstag 25. April 2006, 11:50
von Joghurt
murph hat geschrieben:Alle Programme, die nicht Vorbildmäßig wie eine Musterlösung aussehen, sind folglich hässlich/dreclig?
In der Regel schon.
Wenn man nachdenken muss, was genau da gerade passiert, ist es hässlich.

Aber über Schönheit lässt sich bekanntermaßen sehr gut streiten.

Verfasst: Dienstag 25. April 2006, 12:16
von aldana
hmm, alles etwas offtopic... den refactoring aspekt (verständlichkeit/wartbarkeit von code) wollte ich eigentlich nicht ankratzen.

ist denn die lösung (underscore zu camel schreibweise) auch mit regulären ausdrücken möglich??

danke.

Verfasst: Dienstag 25. April 2006, 12:24
von modelnine
ist denn die lösung (underscore zu camel schreibweise) auch mit regulären ausdrücken möglich??
Natürlich.

Code: Alles auswählen

from re import compile, I

USCOREID = compile("[a-z][a-z0-9]*(_[a-z0-9]*)+",I)

def chcase(match):
    items = match.group(0).split("_")
    return "".join([items[0].lower()]+[item.capitalize() for item in items[1:]])

data = """<?php $get_my_stuff = "blubber";
if( $my_stuff == "hello" ) echo "blabla"; ?>"""

print "Vor der Transformation:"
print data
print

data = USCOREID.sub(chcase,data)

print "Nach der Transformation:"
print data
print
USCOREID matcht jeden gültigen Identifier (der nicht mit einem Unterstrich anfängt!), der mindestens einen Underscore im Identifier hat (auf Python-Manier, es wird nicht nach dem $ gesucht; das könnte man natürlich auch machen, aber so könnte man auch Python-Code damit transformieren). Vorsicht ist natürlich bei den eingebauten String-Processing-Geschichten von PHP geboten:

Code: Alles auswählen

"${blubber}" 
zu matchen ist nicht ganz einfach, besonders wenn's dann ein Ausdruck ist.

Verfasst: Dienstag 25. April 2006, 14:40
von aldana
hmm, danke, aber immer noch nicht ganz die antwort auf meine erste frage.

also zurück zu meinem ersten (jetzt etwas abgeänderten) beispiel. gäbe es für die sub() definition einen modifier, der \1 in einen grossbuchstaben umwandelt (im falle es ist ein kleines alphabetisches zeichen)?

Code: Alles auswählen

import re
patternUnderscore=re.compile(r'_([a-zA-Z])')
camelText=patternUnderscore.sub(r'\1',underscoreText)  # toCapital modifier for \1 ??
würde mich etwas wundern, dass es sowas gibt, da ja bei \1 (backreferencing) nicht klar ist, ob es sich um ein lateinisches alphabetisches zeichen handelt, welche im Gegensatz zu Zahlen oder anderen alphabeten überhaupt grossbuchstaben kennen.
aber wegen diesen kleinen details ja die frage an die community :)

Verfasst: Dienstag 25. April 2006, 15:51
von modelnine
Siehst Du, wie ich es gemacht habe? Wenn's einen Modifier gäbe, hätte ich den auch genommen (denn warum mir die Arbeit machen eine Zusatzfunktion zu schreiben). Aber: ich habe eine Funktion genommen, die genau das macht (nämlich blubb_hastenichgesehen in blubbHastenichgesehen zu wandeln), denn sub nimmt auch Funktionen entgegen um die Ersetzung zu bestimmen, die das Match-Objekt bekommen.

Verfasst: Dienstag 25. April 2006, 23:44
von aldana
okay, danke.

wollte halt nur wissen, ob es in der regulären ausdrücke sprache von python einen eingebauten modifier gibt.