Mam 3 API, które zwracają dane JSON do 3 zmiennych słownika. Biorę niektóre wartości z słownika, aby je przetworzyć. Przeczytałem konkretne wartości, które chcę na liście valuelist. Jednym z kroków jest usunięcie z nich interpunkcji. Zwykle używam string.translate(None, string.punctuation) dla tego procesu, ale dlatego, że dane słownikowe są Unicode, otrzymuję błąd:

    wordlist = [s.translate(None, string.punctuation)for s in valuelist]
TypeError: translate() takes exactly one argument (2 given)

Czy jest wokół tego? Albo przez kodowanie Unicode lub zastąpienie string.translate?

24
adohertyd 27 lipiec 2012, 20:49

3 odpowiedzi

Zauważyłem, że string.Translate jest przestarzały. Ponieważ usuwasz interpunkcję, nie tłumaczysz znaków, możesz użyć funkcji RE.SUB.

    >>> import re

    >>> s1="this.is a.string, with; (punctuation)."
    >>> s1
    'this.is a.string, with; (punctuation).'
    >>> re.sub("[\.\t\,\:;\(\)\.]", "", s1, 0, 0)
    'thisis astring with punctuation'
    >>>
6
ncultra 27 lipiec 2012, 17:14

W tej wersji możesz stosunkowo zrobić swoje listy do innych

def trans(to_translate):
    tabin = u'привет'
    tabout = u'тевирп'
    tabin = [ord(char) for char in tabin]
    translate_table = dict(zip(tabin, tabout))
    return to_translate.translate(translate_table)
3
madjardi 1 październik 2013, 11:12

Moduł Python {X0} / A>, co powinno przyjmować obiekt Match i zwrócić odpowiednią wymianę. Możemy użyć tej funkcji, aby zbudować niestandardową funkcję tłumaczenia znaków:

import re

def mk_replacer(oldchars, newchars):
    """A function to build a replacement function"""
    mapping = dict(zip(oldchars, newchars))
    def replacer(match):
        """A replacement function to pass to re.sub()"""
        return mapping.get(match.group(0), "")
    return replacer

Przykład. Dopasuj wszystkie małe litery ({x0}}), przekłada "H" i odpowiednio "i" do "H" i "I", usuń inne mecze:

>>> re.sub("[a-z]", mk_replacer("hi", "HI"), "hail")
'HI'

Jak widać, może być używany z krótkimi (niekompletnymi) zestawami wymianami i może być używany do usunięcia niektórych znaków.

Przykład Unicode:

>>> re.sub("[\W]", mk_replacer(u'\u0435\u0438\u043f\u0440\u0442\u0432', u"EIPRTV"), u'\u043f\u0440\u0438\u0432\u0435\u0442')
u'PRIVET'
1
sastanin 27 styczeń 2015, 17:35