Могу ли я сделать несколько строк заменить в одном выражении в Python - PullRequest
2 голосов
/ 15 сентября 2011

Я пытаюсь использовать несколько ненужных символов в строке, используя следующую инструкцию:

desc = string.replace(desc,'“','"')
desc = string.replace(desc,'”','"')
desc = string.replace(desc,'·','.') 

Могу ли я записать вышеупомянутые 3 утверждения в одно утверждение или объединить первые два утверждения в одно утверждение.

Я не могу использовать сторонние библиотеки в моем проекте.

Редактировать @unutbu:
Моя строка выглядит следующим образом:

Это '“' my teststring '”'. Я хочу заменить Юникод соответствующим HTML, а не всю строку только значениями Юникода.

После использования кода:

import HTMLParser

text='“ ” ·'
parser=HTMLParser.HTMLParser()
desc=parser.unescape(text)

Я получаю только HTML-эквиваленты, а не строку. Но я просто хочу заменить соответствующие значения, сохраняя все в исходной строке.

Я ожидаю, что выход будет таким, как показано ниже:

Это "моя тестовая строка". Я хочу заменить Юникод соответствующим HTML, а не всю строку, только значениями Юникода.

Ответы [ 2 ]

4 голосов
/ 15 сентября 2011

HTMLParser находится в стандартной библиотеке:

import HTMLParser

text='“ ” ·'
parser=HTMLParser.HTMLParser()
desc=parser.unescape(text)
print(desc)
# “ ” ·

Если вы хотите это в одном выражении, вы, конечно, можете сделать

desc=HTMLParser.HTMLParser().unescape(text)

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

Обратите внимание, что HTMLParser.unescape исчезнет1013 * все HTML-объекты, определенные в htmlentitydefs.names2codepoint (плюс ').


Редактировать: HTMLParser.unescape возвращает символы, отличные от того, что вы опубликовали.Чтобы получить именно эти символы, вы можете использовать xml.sax.saxutils :

text='“ ” ·'
import xml.sax.saxutils as saxutils
print(saxutils.unescape(text,{'“':'"', '”':'"', '·':'.', }))
# " " .

Обратите внимание, что saxutils.unescape также заменяет <, > и &.Если вы хотите заменить только “, ” и &middot, я бы использовал aix's answer .

3 голосов
/ 15 сентября 2011

Первые два вы можете сделать вместе, используя регулярные выражения:

desc = re.sub('&[rl]dquo;', '"', desc)

Если вы предвидите наличие множества таких шаблонов, вы можете поместить их в словарь и применить в цикле:

patterns = {'&[rl]dquo;': '"',
            '·':   '.'}

for pattern, repl in patterns.items():
    desc = re.sub(pattern, repl, desc)

Как и ваш исходный код, он дольше не масштабируется desc, так как сканирует строку несколько раз. Вот расширяемая версия, которая сканирует строку только один раз:

import re

subs = {'rdquo':  '"',
        'ldquo':  '"',
        'middot': '.'}

def repl(matchobj):
  return subs.get(matchobj.group(1), matchobj.group(0))

desc = 'sdf sdfs “ sdf sd “ skdfh · sdf &nonsub; jk'
print re.sub('&(.*?);', repl, desc)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...