Python: Как использовать string.translate () для замены кавычек? (для создания "слизняка") - PullRequest
2 голосов
/ 08 марта 2012

Я хочу удалить все странные символы из строки, чтобы сделать ее "безопасной для URL".Поэтому у меня есть функция, которая выглядит следующим образом:

def urlize(url, safe=u''):
   intab =  u"àáâãäåòóôõöøèéêëçìíîïùúûüÿñ" + safe
   outtab = u"aaaaaaooooooeeeeciiiiuuuuyn" + safe
   trantab = dict((ord(a), b) for a, b in zip(intab, outtab))
   return url.lower().translate(trantab).strip()

Это прекрасно работает, но теперь я хочу повторно использовать эту функцию для разрешения специальных символов.Например, кавычка.

urlize(u'This is sóme randóm "text" that í wánt to process',u'"')

... и это выдает следующую ошибку:

Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: expected a character buffer object

Я пытался, но не работал:

urlize(u'text',u'\"')
intab =  u"àáâãäåòóôõöøèéêëçìíîïùúûüÿñ%s" , safe

- РЕДАКТИРОВАТЬ - Полная функция выглядит следующим образом

def urlize(url, safe=u''):

    intab =  u"àáâãäåòóôõöøèéêëçìíîïùúûüÿñ" + safe
    outtab = u"aaaaaaooooooeeeeciiiiuuuuyn" + safe
    trantab = dict((ord(a), b) for a, b in zip(intab, outtab))
    translated_url = url.lower().translate(trantab).strip()

    pos = 0
    stop = len(translated_url)
    new_url= ''
    last_division_char = False

    while pos < stop:
        if not translated_url[pos].isalnum() and translated_url[pos] not in safe:
            if (not last_division_char) and (pos != stop -1):
                new_url+='-'
                last_division_char = True
        else:
            new_url+=translated_url[pos]
            last_division_char = False
        pos+=1

    return new_url

- РЕДАКТИРОВАТЬ - Цель

Что я хочуэто нормализовать текст, чтобы я сам мог поместить его в URL и использовать как Id.Например, если я хочу показать продукты из категории, я бы предпочел поставить «ninos-y-bebes» вместо «niños-y-bebés» (испанский для детей и младенцев).Я действительно не хочу, чтобы все символы (которые являются специальными символами на испанском языке) в моем URL, но я также не хочу избавляться от них.Вот почему я хотел бы заменить все символы, которые выглядят одинаково (не на все 100%, мне все равно), а затем удалить все оставшиеся не буквенно-цифровые символы.

1 Ответ

6 голосов
/ 08 марта 2012

Модуль unidecode является более безопасной опцией (он будет обрабатывать другие специальные символы, такие как "степень"):

>>> from unidecode import unidecode
>>> s = u'This is sóme randóm "text" that í wánt to process'
>>> unidecode(s)
'This is some random "text" that i want to process'
>>> import urllib
>>> urllib.urlencode(dict(x=unidecode(s)))[2:]
'This+is+some+random+%22text%22+that+i+want+to+process'

[обновление]

я думаю, что уже делаю это -> ты "ааааааоооооеееецииииууууын" - Марко Бруггманн

Достаточно справедливо, если вы хотите отслеживать все символы Юникода для своей таблицы перевода (акцентированные символы - не единственные проблемы, на вашем параде очень много символов).

Хуже всего то, что многие символы Юникода могут быть визуально идентичны своим аналогам в ASCII, что приводит к трудностям в диагностике ошибок.

[обновление]

Как насчет чего-то вроде:

>>> safe_chars = 'abcdefghijklmnopqrstuvwxyz01234567890-_'
>>> filter(lambda x: x in safe_chars, "i think i'm already doing that")
'ithinkimalreadydoingthat'

[обновление]

@ Daenyth Я пробовал, но получаю только ошибки: из urllib import urlencode => urlencode ('google.com/';) => TypeError: недопустимая нестроковая последовательность или объект сопоставления - Marco Bruggmann

Функция urlencode предназначена для получения форматированного вывода QUERYSTRING (a = 1 & b = 2 & c = 3). Ожидаются пары ключ / значение:

>>> urllib.urlencode(dict(url='google.com/'))
'url=google.com%2F'

>>> help(urllib.urlencode)
Help on function urlencode in module urllib:

urlencode(query, doseq=0)
    Encode a sequence of two-element tuples or dictionary into a URL query string.

    If any values in the query arg are sequences and doseq is true, each
    sequence element is converted to a separate parameter.

    If the query arg is a sequence of two-element tuples, the order of the
    parameters in the output will match the order of parameters in the
    input.
(END)

[обновление]

Это будет работать без сомнения, но я хочу нормализовать текст, чтобы я мог сам поместить его в URL и использовать его как Id. Например, если я хочу показать продукты из категории, я бы предпочел поставить «ninos-y-bebes» вместо «niños-y-bebés» (испанский для детей и младенцев). Я действительно не хочу, чтобы все символы (которые являются специальными символами на испанском языке) в моем URL, но я также не хочу избавляться от них. Вот почему я хотел бы заменить все символы, которые выглядят одинаково (не на все 100%, мне все равно), а затем удалить все оставшиеся не буквенно-цифровые символы.

Хорошо, Марко, вам нужна процедура для создания так называемых слизней , не так ли?

Вы можете сделать это в одну строку:

>>> s = u'This is sóme randóm "text" that í wánt to process'
>>> allowed_chars = 'abcdefghijklmnopqrstuwvxyz01234567890'
>>> ''.join([ x if x in allowed_chars else '-' for x in unidecode(s.lower()) ])
u'this-is-some-random--text--that-i-want-to-process'
>>> s = u"Niños y Bebés"
>>> ''.join([ x if x in allowed_chars else '-' for x in unidecode(s.lower()) ])
u'ninos-y-bebes'
>>> s = u"1ª Categoria, ½ docena"
>>> ''.join([ x if x in allowed_chars else '-' for x in unidecode(s.lower()) ])
u'1a-categoria--1-2-docena'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...