Regulärer Ausdruck

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
sabram
User
Beiträge: 28
Registriert: Mittwoch 5. Januar 2011, 13:42

Ich versuche mich gerade an einem regulären Ausdruck den ich zum ersetzen verwenden möchte.

Mein String kann wie folgt aussehen : "asdasd 7563fhsd %WICHTIG%" , das problem was ich nur sehe ist bei so sachen wie
"print %a %b" , ich möchte nun irgendwie versuchen das der reguläre ausdruck keine leerzeichen enthält.

re.findall(r"%.*%",a) war mein bisheriger Versuch, da werden allerdings leerzeichen ignoriert und mit in den searchstring gezogen.

Habt ihr da vielleicht eine Idee für mich?

Vielen dank
Mfg sabram
BlackJack

@sabram: Kannst Du die Zeichenmenge nicht irgendwie einschränken? 'WICHTIG' besteht ja zum Beispiel nur aus Buchstaben. Ansonsten solltest Du das Muster nicht "greedy" matchen, denn sonst bekommst Du Probleme wenn mehr als ein %PLATZHALTER% in der Zeichenkette vorkommt.
sabram
User
Beiträge: 28
Registriert: Mittwoch 5. Januar 2011, 13:42

naja was heißt die zeichenmenge einschränken, der string zwischen den beiden %String% kann so ziemlich aus allem bestehen außer halt leerzeichen.

bsp

%log_viewer%
%blabla_bla_bla%
%blubbel_bla1%

nur irgendwie scheint sowas wie re.sub(r"%[a-zA-Z0-9_]*%","tmp",source) nicht so ganz zu funktionieren :(

ich muss hier halt unterscheiden dass die printausgaben mit "print %a %b" unverändert bleiben.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sabram hat geschrieben:naja was heißt die zeichenmenge einschränken, der string zwischen den beiden %String% kann so ziemlich aus allem bestehen außer halt leerzeichen.
Das schreit nach r"%[^\s]*%" (ungetestet).
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Alles außer Leerzeichen (genauer whitespaces) ist \S, also %\S*?%. Besser, weil einfacher, ist aber IMHO dies: %[^%]*%. In dem Suchwort werden doch aller Wahrscheinlichkeit nicht nur keine Leerzeichen vorkommen, sondern doch wohl auch kein %.

Stefan
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

sma hat geschrieben:Alles außer Leerzeichen (genauer whitespaces) ist \S, also %\S*?%.
Oh natürlich. Ich bin aktuell ein wenig von Oracles regexp-Implementierung verseucht und das schlägt immer wieder durch auch wenn es nicht sinnvoll ist.
sabram
User
Beiträge: 28
Registriert: Mittwoch 5. Januar 2011, 13:42

vielen dank erstmal allen, allerdings verstehe ich nicht ganz wie du von keine whitespaces auf kein % im wort kommst.

Code: Alles auswählen

%[^%]*%
heißt das nicht, das wort darf alles enthalten außer Prozentzeichen?

dann würde ja sowas wie print "%a %b" in den ausdruck fallen als %a % , oder sehe ich das falsch?
sma
User
Beiträge: 3018
Registriert: Montag 19. November 2007, 19:57
Wohnort: Kiel

Nein, da hast du recht. War keine so gute Idee von mir.

Stefan
sabram
User
Beiträge: 28
Registriert: Mittwoch 5. Januar 2011, 13:42

Vielen lieben Dank das klappt soweit nur irgendwie hänge ich nun einer anderen Stelle ich füge das hier einfach mal an:

Ich versuche Syntaxfehler in Pythoncode zu finden mit Hilfe der Built-In compile Funktion

Code: Alles auswählen

if '\r' in source:
    source = re.sub(r"\r\n", "\n", source)
    source = re.sub(r"\r", "\n", source)
    if source and source[-1] != '\n':
        source = source + '\n'
try:
    # try to compile the code, we dont need RunTimeErrors
    compile(source, "testSource", "exec")
except (SyntaxError, OverflowError), err:
                
        # on SyntaxError, place a Marker to the erroneous line
        # make sure it is visible
        # and show the errorbox
        msg, (errorfilename, lineno, offset, line) = err
        self.pythoneditor_0.MarkerAdd(lineno-1,1)
        self.pythoneditor_0.GotoLine(lineno)
        self.errorbox(msg+" in line "+str(lineno))
Das funktioniert auch alles soweit nun habe ich das Problem, dass mein Code unter Umständen die oben genannten Keywords enthält. Also im Code kann an irgendeiner Stelle stehen %variable%. Diese wird intern später durch einen ausdruck ersetzt, ist für mich aber an dieser Stelle nur schwer zugreifbar,bzw gar nicht.

Das Hauptproblem an diesen "Dingern" ist, dass sie entweder normale Strings sind ( also simpler variablenname ) oder aber ein String in anführungsstrichen "bla".
Da der Python Compiler natürlich %tmp% als Syntaxerror ansieht müsste ich diese ersetzen.

Problem : ich weiß ja nicht, ob es nun ein ein Variablenname oder String ist.
Meine erste Idee war, mehrfach zu compilen mit je zwei unterschiedlichen Versionen des Codes ( einmal alle vorkommen durch "tmp" einmal durch tmp ersetzt ). Aber da im code auch beides vorkommen kann hilft mir das nicht :/

Habt ihr vielleicht eine Idee? Vielleicht kann ich diese speziellen Syntaxfehler einfach ignorieren?

Gruß sabram
BlackJack

@sabram: Verrate doch mal, was Du da machen willst? Sollen das Platzhalter in Code-Templates für einen Editor sein? Wenn die für Stellen im Quelltext stehen sollen, bei denen der Benutzer später etwas eingeben/ausfüllen kann, dann dürfte das was Du da vorhast überhaupt nicht gehen. Denn ein Template muss ja in keiner weise syntaktisch korrekt sein. Es wäre halt schön, wenn der Benutzer leicht zu etwas syntaktisch korrektem kommt, wenn er etwas in die "Lücken" eingibt, aber du kannst dem Programm ja nicht beibringen, dass es etwas "erfindet" was das Template so ergänzt, dass ein syntaktisch korrektes Stück Quelltext heraus kommt. Man könnte sich ja zum Beispiel auch folgendes Template ausdenken:

Code: Alles auswählen

def %func%(%args%):
    "%doc%
Hintergedanke ist, dass der Benutzer später entscheiden kann, ob er gleich mit dem DocString loslegt oder noch zwei " eingibt und dann eine mehrzeilige Doku schreibt. Hier kann man '%doc%' weder durch einen Namen noch eine Zeichenkette zu etwas Korrektem ergänzen.

Für die Zeilenendenersetzung muss man übrigens nicht `re` bemühen -- das ist doch einfaches Ersetzen von statischen Zeichenketten durch statische Zeichenketten a.k.a. `str.replace()`.

Hast Du bei Deinem ersetzen eigentlich bedacht, dass in normalen Quelltexten auch Deine Platzhalter oder einzelne '%' vorkommen können? Wie gehst Du damit um? Was ist mit '%%'? Beispiele:

Code: Alles auswählen

print '%PYTHONPATH% ist falsch gesetzt'

def percentage(total, current):
    return '%.2f%%' % (100.0 / total * current)

# `foo` und `bar` haben `__mod__` irgendwie sinnvoll implementiert.
spam = foo%bar%baz
sabram
User
Beiträge: 28
Registriert: Mittwoch 5. Januar 2011, 13:42

@BlackJack : Vielen Dank für deine Antwort.

Was ich mit diesen Platzhaltern versuche ist folgendes. Ich habe eine Art Testprogramm geschrieben, welches mehrere Steps enthält. Jeder Step kann Pythoncode enthalten, der in einem Editor eingegeben wird. In diesem Code ist es möglich Keywords zu benutzen , ebend die Wörter in %Keyword%. Innerhalb des Tests werden diese Keywords intern definiert. Bei der Ausführung des Tests nimmt sich ein anderes Modul, alle Steps und baut daraus ein ausführbares Programm.
In diesem Sinne stehen die Keywords meistens nur für Variablen oder direkte Stringausgaben.
Hier mal ein paar Beispiele :

Code: Alles auswählen

LayPathList = Instr.GetLayoutList()
%LayList% = []
for l in LayPathList:
    l_name = l.split("\\")[-1][:-4]
    %LayList%.append(l_name)


%LayList%.sort()

Code: Alles auswählen

SDFFile        = os.path.join(TestDataPath, %SDFFile% )
XMLFile 	   = os.path.join(TestDataPath, %XMLFile% )
Zu den anderen Fragen, einzelne % sollten nicht in den regulären ausdruck %[\s]*% fallen und stellen damit kein problem dar.
Bei %% obwohl ich sie noch nie zuvor gesehen habe, müsste ich eigentlich nur testen, dass zwischen den %% irgendetwas steht, dann ist es ein Keyword ( und muss beim compilieren irgendwie ignoriert werden )
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Ich fühle hier ein XY-Problem. Was willst du eigentlich machen? So wie ich sehe generierst du Python-Code, was in den allermeisten Fällen der falsche Ansatz zur Lösung von Problemen ist.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten