Problem mit RegExps und Sonderzeichen

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.
uselessuser
User
Beiträge: 8
Registriert: Dienstag 29. Mai 2007, 20:54

Problem mit RegExps und Sonderzeichen

Beitragvon uselessuser » Dienstag 29. Mai 2007, 21:03

Hallo Forum,

ich habe hier ein Problem: In einem Text moechte ich jedes Sonderzeichen, das nicht inerhalb von <tags> auftaucht, durch ein "\n" + das selbe Sonderzeichen + "\n" ersetzen.
Allerdings beschwert sich Python, sobald man ein bedeutungsschwangeres Zeichen verwendet. Es kommen dann zB. Meldungen wie "unbalanced parentheses" bei "(".
Wenn ich jedoch die einzelnen Strings mit re.escpae(string) bearbeite, frisst Python 16 GB RAM, bevor ich den Prozess kille.

Bisher habe ich es so versucht:

Code: Alles auswählen

for i in re.findall('(?s)>(.+?)<', string):
   string = re.sub(i, re.sub('([^\d\w\s])', '\n\1\n', i), string)


string ist der gesamte Text, in dem ersetzt werden soll. Das fuehrt zu obigem Ergebnis. Hat jemand eine Tipp fuer mich? (Man wird es wahrscheinlich am Code merken, ich bin ziemlicher Anfaenger.)
BlackJack

Beitragvon BlackJack » Dienstag 29. Mai 2007, 21:49

Der Ansatz sieht sehr kompliziert aus. Man kann bei `re.sub()` statt eines Ersetzungsmusters eine Funktion angeben, die mit dem `match` aufgerufen wird und eine Zeichenkette zurückliefern muss, welche dann für den Treffer eingesetzt wird. Das würde ich an dieser Stelle verwenden.

Code: Alles auswählen

import re

def main():
    source = '<tag>ham 23 eggs 42.<tag>'
   
    def replace_specials(match):
        return '>%s<' % re.sub('[\d]+',
                               lambda m: '{0x%x}' % int(m.group(0)),
                               match.group(1))
   
    result = re.sub('>(.*?)<', replace_specials, source)
    print result


Ausgabe:

Code: Alles auswählen

<tag>ham {0x17} eggs {0x2a}.<tag>

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder