Seite 1 von 1

Problem mit RegExps und Sonderzeichen

Verfasst: Dienstag 29. Mai 2007, 21:03
von uselessuser
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.)

Verfasst: Dienstag 29. Mai 2007, 21:49
von BlackJack
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>