Schwierigkeiten beim Umgang mit ähnlichen Charakteren, um verschiedene Dinge mit Regex in Python zu drucken

Ich habe einzelne Buchstaben b, c, d …. dass ich für zufällige Wörter mit einem Wörterbuch und re.sub und multiple_replace Funktion aus regex Bibliothek ersetzt. Also, b = buch, c = koch, d = dook, etc ..

Allerdings, wenn es eine Wiederholung von bb, cc oder dd … Ich möchte in der Lage, diese Briefe ausdrucken etwas anderes statt, wo alle Doppel-Buchstaben sind gleichbedeutend mit einem einzigen Wort wie bb = blah, cc = blah , Dd = blah gefolgt von ihrem Brief. Also bb = blahb, cc = blahc, dd = blahd.

  • Wie bekomme ich das B-Präfix in einem String in Python?
  • Maximal 2 zahlen
  • Python ausführbare Dateien: py2exe oder PyInstaller?
  • Numpy float: 10x langsamer als eingebaut in arithmetischen Operationen?
  • Anpassen eines Admin-Formulars in Django unter Verwendung von Autodiscover
  • Pypy: positional und benannte binds können nicht vermischt werden
  • Wie kann ich das machen?

    Ich habe versucht:

    print multiple_replace(dict, re.sub(r'([bcdfghjklmnpqrstvwxyz])\1', r'science\1', text, flags = re.I)) 

    Wo dict ist das Wörterbuch mit den Wörtern b = buch, c = koch, d = dook, etc ..

    Und re.sub Funktion schließt alle doppelten Buchstaben außer Vokale ein, die durch das Wort Wissenschaft und ihren Buchstaben ersetzt werden sollen. Der Text steht für meine Eingabezeichenfolge, die ich in die im Wörterbuch gefundenen String-Ersetzungen umwandeln möchte.

    Also, ich möchte, dass die Ausgabe bb = scienceb ist, cc = sciencec aber das Problem, das ich derzeit habe, ist das anstatt den String "science" zu drucken. Es druckt die String-Ersetzungen des Wortes Wissenschaft im Inneren des Wörterbuchs gefunden. Also "s": "sook", "c": "kochen", "i": "i", "n": "nook"

    So druckt es jeden doppelten Buchstaben Wort es würde es mit sookcookiecooknooke in meinem Text String ersetzen. Warum das? Wie kann ich es beheben?

    Wenn ich verwirrend bin, lass es mich wissen. Ich danke dir sehr!

    BEARBEITEN:

    Hier ist der Code, mit dem ich arbeite:

     import re def multiple_replace(dict, text): # Create a regular expression from the dictionary keys regex = re.compile("(%s)" % "|".join(map(re.escape, dict.keys()))) # For each match, look-up corresponding value in dictionary return regex.sub(lambda mo: dict[mo.string[mo.start():mo.end()]], text) if __name__ == "__main__": text = "This is my first regex python example yahooa yahoouuee bbbiirdd" dict = { "a" : "a", "b" : "book", "c" : "cook", "d" : "dook", "e" : "e", "f" : "fook", "g" : "gook", "h" : "hook", "i" : "i", "j" : "jook", "k" : "kook", "l" : "look", "m" : "mook", "n" : "nook", "o" : "o", "p" : "pook", "q" : "qook", "r" : "rook", "s" : "sook", "t" : "took", "u" : "u", "v" : "vook", "w" : "wook", "x" : "xook", "y" : "yook", "z" : "zook", } print multiple_replace(dict, re.sub(r'([bcdfghjklmnpqrstvwxyz])\1', r'science\1', text, flags = re.I)) 

  • Besserer Weg zum Scannen von USB-Geräte in Linux
  • Prüfen Sie, ob der Benutzer sich zum ersten Mal angemeldet hat, ohne django-allauth zu verwenden
  • Customizing Code von Qt Designer Widget?
  • ImportError: dynamisches Modul definiert keine init-Funktion, aber es tut
  • Python - Gibt es eine Möglichkeit, Pip ohne Setuptools zu bekommen?
  • Python WaitForDebugEvent & ContinueDebugEvent (Grey Hat Python)
  • 2 Solutions collect form web for “Schwierigkeiten beim Umgang mit ähnlichen Charakteren, um verschiedene Dinge mit Regex in Python zu drucken”

    Ihr Code ersetzt die doppelten Buchstaben im text mit "science" und dem Brief, dann übergibt die Zeichenfolge an multiple_replace die dann jeden einzelnen Buchstaben – einschließlich der Buchstaben in "science" – mit dem entsprechenden Wörterbuchwert ersetzt.

    Eine bessere Methode, um den Ersatz zu machen, wäre, einen Rückruf an sub und einen Regex zu verwenden, der doppelte oder einzelne Buchstaben abgestimmt hat. Der Rückruf würde bestimmen, was passiert war und den entsprechenden Ersatz zurückgibt.

    Wenn du mit dem Code beharren möchtest, den du bereits hast, ist eine schnelle Möglichkeit, die Buchstaben in "science" zu ersetzen, die ersetzt wird, um die Regex in multiple_replace zu ändern

     regex = re.compile("science|(?<!science)(%s)" % "|".join(map(re.escape, dict.keys()))) 

    Und füge "science" : "science", zum dict .

    Dies bedeutet, dass "science" durch "science" , und der negative Look-behind (?<!science) wird verhindern, dass der Brief darauf folgt, dass er ersetzt wird.

    Die oben genannten ist aber keine gute Lösung für Ihr Problem. Wenn du Glück hast, ist jemand, der mit Python vertraut ist, als ich einen besseren anbieten werde.

    Weitere Kommentare und Anpassung der Lösung von eyquem

     import re def multiple_replace(dict, text): def repl(match): single, double = match.groups() if double: return 'science' + single else: return dict[single] if single in dict else single return re.sub(r'([bcdfghj-np-tv-z])(\1)?', repl, text, flags=re.I) if __name__ == "__main__": text = "This is my d's first try at cing, yahooa yahoouuee bbbiirdd" dict = { "b" : "blah", "c" : "cook", "d" : "dog" } print multiple_replace(dict, text) # This is my dog's first try at cooking, yahooa yahoouuee sciencebblahiirscienced 

    Die Ausgabe für "This is my first ... darf nicht sein
    Thookisook isook mookyook fookirooksooktook`... wie du geschrieben hast,
    Aber Tookhookisook isook mookyook fookirooksooktook ...

    Der folgende Code macht den Job nach Ihren Erklärungen.
    Es ist kein Wörterbuch nötig.

     import re if __name__ == "__main__": def repl(ma): g1,g2 = ma.groups() if g2: return 'science' + g2 else: return g1 + 'ook' print '------------ 1 ----------------------' text = "This is my first regex python example yahooa yahoouuee bbbiirdd" print text,'\n' wanted = ('Tookhookisook isook mookyook fookirooksooktook ' 'rookegookexook pookyooktookhookonook exookamookpooklooke ' 'yookahookooa ' 'yookahookoouuee ' 'sciencebbookiirookscienced') print 'wanted == %s' % wanted res = re.sub(r'([bcdfghj-np-tv-z])(\1?)', repl, text, flags = re.I) print '\nres == %s' % res print 'res==wanted : ',res==wanted print '------------ 2 ----------------------' print 'bbbiirdd' wanted = 'sciencebbookiirookscienced' print 'wanted == %s' % wanted res = re.sub(r'([bcdfghj-np-tv-z])(\1?)', repl, 'bbbiirdd', flags = re.I) print '\nres == %s' % res print 'res==wanted : ',res==wanted 
    Python ist die beste Programmiersprache der Welt.