regulärer ausdruck: umstellung auf camel schreibweise

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
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

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.
mitsuhiko
User
Beiträge: 1790
Registriert: Donnerstag 28. Oktober 2004, 16:33
Wohnort: Graz, Steiermark - Österreich
Kontaktdaten:

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
TUFKAB – the user formerly known as blackbird
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

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...
icepacker
User
Beiträge: 49
Registriert: Dienstag 15. November 2005, 18:48

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?!
ubuntu linux !!
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
murph
User
Beiträge: 622
Registriert: Freitag 14. April 2006, 19:23
Kontaktdaten:

Alle Programme, die nicht Vorbildmäßig wie eine Musterlösung aussehen, sind folglich hässlich/dreclig?
Joghurt
User
Beiträge: 877
Registriert: Dienstag 15. Februar 2005, 15:07

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.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

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.
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
--- Heiko.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

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 :)
modelnine
User
Beiträge: 670
Registriert: Sonntag 15. Januar 2006, 18:42
Wohnort: Celle
Kontaktdaten:

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.
--- Heiko.
aldana
User
Beiträge: 12
Registriert: Donnerstag 20. April 2006, 16:29

okay, danke.

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