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.

  • Numpy hstack - "ValueError: alle Eingabe-Arrays müssen die gleiche Anzahl von Dimensionen haben" - aber sie tun
  • Python-Weg für Objektmethodenketten für Klasseninstanzvariablen
  • Fügen Sie eine neue Spalte basierend auf booleschen Werten in einer anderen Spalte hinzu
  • Wo ist die help.py für Android Monkeyrunner
  • Gunicorn Internal Server Fehler
  • Python Selen Element Click Behaving Strangeley
  • 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)) 

  • Kann nicht in ASP.NET-Website mit Anfragen Modul von Python anmelden
  • Was ist der schnellste Weg, um ein Integer-Array in Python zu initialisieren?
  • Selen - kein Modul namens http.client
  • Wie nennt man eine Instanz einer Klasse in Python?
  • Warum kann python Glob meinen Daumen nicht erkennen (und was kann ich dagegen tun?)
  • Pip installieren pynrrd
  • 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.