Как удалить\n, \ ", \\ и т. Д. Из строки [duplicate]

Держите его сухим и простым глупым !!

function reverse(s){
let str = s;
var reverse = '';
for (var i=str.length;i>0;i--){

    var newstr = str.substring(0,i)
    reverse += newstr.substr(-1,1)
}
return reverse;
}
78
задан dln385 26 October 2010 в 04:43
поделиться

7 ответов

Правильная вещь - использовать код «escape-escape» для декодирования строки.

>>> myString = "spam\\neggs"
>>> decoded_string = bytes(myString, "utf-8").decode("unicode_escape") # python3 
>>> decoded_string = myString.decode('string_escape') # python2
>>> print(decoded_string)
spam
eggs

Не используйте AST или eval. Использование строковых кодеков намного безопаснее.

108
ответ дан Jerub 19 August 2018 в 08:44
поделиться
  • 1
    руки вниз, лучшее решение! Кстати, по документам он должен быть «string_escape». (с подчеркиванием), но по какой-то причине принимает что-либо в шаблоне «escape строки», «string @ escape & quot; и еще чего ... в основном 'string\W+escape' – Nas Banov 26 October 2010 в 06:18
  • 2
    @Nas Banov В документации мало упоминается об этом : Notice that spelling alternatives that only differ in case or use a hyphen instead of an underscore are also valid aliases; therefore, e.g. 'utf-8' is a valid alias for the 'utf_8' codec. – dln385 26 October 2010 в 06:44
  • 3
    В Python 3 команда должна быть print(bytes(myString, "utf-8").decode("unicode_escape")) – dln385 26 October 2010 в 07:06
  • 4
    Это решение недостаточно хорошо, потому что оно не обрабатывает случай, когда в исходной строке есть законные символы Unicode. Если вы попытаетесь: >>> print("juancarlo\\tañez".encode('utf-8').decode('unicode_escape')) Вы получаете: juancarlo añez – Apalala 1 July 2014 в 20:04
  • 5
    Согласился с @Apalala: это недостаточно. Ознакомьтесь с ответом rseeper ниже для полного решения, которое работает в Python2 и 3! – Christian Aichinger 28 March 2016 в 03:26
  • 6
    – metatoaster 25 May 2018 в 09:01

Фактически правильный и удобный ответ для python 3:

>>> import codecs
>>> myString = "spam\\neggs"
>>> print(codecs.escape_decode(bytes(myString, "utf-8"))[0].decode("utf-8"))
spam
eggs
>>> myString = "naïve \\t test"
>>> print(codecs.escape_decode(bytes(myString, "utf-8"))[0].decode("utf-8"))
naïve    test

Подробности относительно codecs.escape_decode:

  • codecs.escape_decode - это декодер с байтами в байтах
  • codecs.escape_decode декодирует escape-последовательности ascii, такие как: b"\\n" -> b"\n", b"\\xce" -> b"\xce".
  • codecs.escape_decode не заботятся или необходимо знать о кодировке байтового объекта, но кодирование экранированных байтов должно соответствовать кодировке остальной части объекта.

Фон:

  • @rspeer верен: unicode_escape является неправильным решением для python3. Это связано с тем, что unicode_escape декодирует экранированные байты, затем декодирует байты в строку unicode, но не получает никакой информации о том, какой кодек использовать для второй операции.
  • @Jerub верен: избегайте AST или eval.
  • Я впервые обнаружил codecs.escape_decode из этот ответ на вопрос «как я .decode (« string-escape ») в Python3?» . Как сказано в этом ответе, эта функция в настоящее время не документирована для python 3.
13
ответ дан Community 19 August 2018 в 08:44
поделиться
  • 1
    Это реальный ответ (: Слишком плохо, что он опирается на плохо документированную функцию. – jwd 21 February 2017 в 19:42
  • 2
    Это ответ для ситуаций, в которых у вас есть escape-последовательности \x с байтами UTF-8. Но поскольку он декодирует байты в байты, он не выполняет и не может декодировать любые escape-символы символов Unicode, отличных от ASCII, например escape-последовательности \u. – rspeer 16 August 2017 в 17:10

Функция ast.literal_eval приближается, но она будет ожидать, что строка будет правильно процитирована сначала.

Конечно, интерпретация обратного слэша Python зависит от того, как строка ("" vs r"" vs u"", тройные кавычки и т. д.), поэтому вам может понадобиться обернуть ввод пользователя в подходящие кавычки и перейти к literal_eval. Обтекание его в кавычках также предотвратит возврат literal_eval числа, кортежа, словаря и т. Д.

Вещи все еще могут оказаться сложными, если пользователь вводит кавычки без кавычек типа, который вы собираетесь обернуть вокруг строки.

6
ответ дан Greg Hewgill 19 August 2018 в 08:44
поделиться
  • 1
    Понимаю. Это кажется потенциально опасным, как вы говорите: myString = "\"\ndoBadStuff()\n\"", print(ast.literal_eval('"' + myString + '"')), похоже, пытается запустить код. Как ast.literal_eval отличается / безопаснее, чем eval? – dln385 26 October 2010 в 05:05
  • 2
    @ dln385: literal_eval никогда не выполняет код. Из документации "Это можно использовать для безопасной оценки строк, содержащих выражения Python, из ненадежных источников без необходимости самостоятельно анализировать значения. & Quot; – Greg Hewgill 26 October 2010 в 05:16
  • 3
    требует Python 2.6+? – Nas Banov 26 October 2010 в 05:54

Если вы доверяете источнику данных, просто пошагите кавычки вокруг него и eval () it?

>>> myString = 'spam\\neggs'
>>> print eval('"' + myString.replace('"','') + '"')
spam
eggs

PS. добавлена ​​встречная мера зла-кода-exec - теперь она будет разбивать все " до eval-ing

-4
ответ дан Nas Banov 19 August 2018 в 08:44
поделиться
  • 1
    Лучшее решение, чем общее назначение eval(), см. В моем ответе. – Greg Hewgill 26 October 2010 в 04:52
  • 2
    Лучшее решение, чем использование модуля ast, см. В моем ответе. – Jerub 26 October 2010 в 06:14
  • 3
    @Greg Hewgill: из любопытства, можете ли вы подумать о каком-либо риске после удаления котировок, как в моем исправленном примере? что ваш аст также имеет проблемы с тем, если в строке есть кавычки, которые «соответствуют», строковые брекеты – Nas Banov 26 October 2010 в 06:21
  • 4
    @Nas Banov: Ваш пример все равно выдает ошибку, если myString заканчивается обратным слэшем. Не серьезная проблема, но, вероятно, нежелательная. – Greg Hewgill 26 October 2010 в 07:00
  • 5
    @Greg Hewgill: не будет ast.literal_eval() делать то же самое? (у меня нет проверки на python 2.6). для меня исключение для исключения из невербальной строки в порядке, «инъекция строки» эксплоит - это то, что меня беспокоит – Nas Banov 27 October 2010 в 00:57

unicode_escape не работает вообще

Оказывается, что решение string_escape или unicode_escape не работает вообще - в частности, оно не работает при наличии фактический Unicode.

Если вы можете быть уверены, что каждый символ не-ASCII будет экранирован (и помните, что все, что находится за пределами первых 128 символов, не является ASCII), unicode_escape будет делать то, что вам нужно. Но если в вашей строке есть какие-то буквальные символы, отличные от ASCII, все будет не так.

unicode_escape в основном предназначен для преобразования байтов в текст Unicode. Но во многих местах - например, исходный код Python - исходные данные уже являются текстами Unicode.

Единственный способ, которым это может работать правильно, - это сначала кодировать текст в байты. UTF-8 - разумная кодировка для всего текста, так что это должно работать, правильно?

Следующие примеры приведены в Python 3, так что строковые литералы чисты, но та же проблема существует с немного отличающимися проявлениями на обоих Python 2 и 3.

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape'))
naïve   test

Ну, это неправильно.

Новый рекомендованный способ использования кодеков, которые декодируют текст в текст, - это вызвать codecs.decode напрямую. Это помогает?

>>> import codecs
>>> print(codecs.decode(s, 'unicode_escape'))
naïve   test

Совсем нет. (Кроме того, вышесказанное представляет собой UnicodeError на Python 2.)

Кодек unicode_escape, несмотря на его имя, оказывается, что все байты, отличные от ASCII, находятся в латинском-1 (ISO-8859 -1). Поэтому вам нужно будет сделать это так:

>>> print(s.encode('latin-1').decode('unicode_escape'))
naïve    test

Но это ужасно. Это ограничивает 256 символов Latin-1, как если бы Unicode никогда не был изобретен вообще!

>>> print('Ernő \\t Rubik'.encode('latin-1').decode('unicode_escape'))
UnicodeEncodeError: 'latin-1' codec can't encode character '\u0151'
in position 3: ordinal not in range(256)

Добавление регулярного выражения для решения проблемы

(Удивительно, что мы теперь нет двух проблем.)

Нам нужно только применить декодер unicode_escape к вещам, которые, несомненно, будут ASCII-текстом. В частности, мы можем убедиться, что применим только к действительным escape-последовательностям Python, которые гарантированно будут ASCII-текстом.

План состоит в том, что мы найдем escape-последовательности, используя регулярное выражение, и используем как аргумент re.sub, чтобы заменить их на их неоцененное значение.

import re
import codecs

ESCAPE_SEQUENCE_RE = re.compile(r'''
    ( \\U........      # 8-digit hex escapes
    | \\u....          # 4-digit hex escapes
    | \\x..            # 2-digit hex escapes
    | \\[0-7]{1,3}     # Octal escapes
    | \\N\{[^}]+\}     # Unicode characters by name
    | \\[\\'"abfnrtv]  # Single-character escapes
    )''', re.UNICODE | re.VERBOSE)

def decode_escapes(s):
    def decode_match(match):
        return codecs.decode(match.group(0), 'unicode-escape')

    return ESCAPE_SEQUENCE_RE.sub(decode_match, s)

И с этим:

>>> print(decode_escapes('Ernő \\t Rubik'))
Ernő     Rubik
77
ответ дан rspeer 19 August 2018 в 08:44
поделиться
  • 1
    нам нужны более широкие типы ответов. Благодарю. – v.oddou 15 January 2015 в 06:36
  • 2
    Работает ли это с os.sep вообще? Я пытаюсь сделать это: patt = '^' + self.prefix + os.sep ; name = sub(decode_escapes(patt), '', name), и он не работает. Точка с запятой есть вместо новой линии. – Pureferret 20 February 2015 в 12:18
  • 3
    @Pureferret Я не совсем уверен, что вы спрашиваете, но вы, вероятно, не должны запускать это на строках, где обратная косая черта имеет другое значение, например пути к файлам Windows. (Это то, что ваш os.sep?) Если у вас есть обратные последовательности escape-последовательностей в именах каталогов Windows, ситуация в значительной степени невосстановима. – rspeer 20 February 2015 в 23:10
  • 4
    У escape-последовательности нет экранов в них, но я получаю ошибку «фиктивной escape-строки» – Pureferret 21 February 2015 в 00:28
  • 5
    Это говорит мне, что вы закончили какое-то другое регулярное выражение с обратным слэшем: stackoverflow.com/questions/4427174/… – rspeer 21 February 2015 в 06:13

Ответ rspeer правильно указывает на то, что unicode-escape подразумевает неявное декодирование с использованием latin-1, но не выполняет его. Если unicode-escape правильно декодирует экраны, но неправильно обрабатывает необработанные байты без ASCII, расшифровывая их как latin-1, то прямое исправление не должно принимать регулярное выражение, а затем перекодировать их как latin-1 после (отменить ошибочная часть процесса), а затем декодировать в правильной кодировке. Например, неправильное использование образца:

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape'))
naïve   test

можно сделать тривиально правильным, добавив .encode('latin-1').decode('utf-8'), сделав его:

>>> s = 'naïve \\t test'
>>> print(s.encode('utf-8').decode('unicode_escape').encode('latin-1').decode('utf-8'))
naïve    test
# Or using codecs.decode to replace the first encode/decode pair with a single text->text transform:
>>> print(codecs.decode(s, 'unicode_escape').encode('latin-1').decode('utf-8'))
naïve    test

Конечно, это много назад и вперед, и я бы не хотел его встроить в свой код, но его можно разделить на автономную функцию, которая работает как для str, так и для bytes (с необязательным шагом декодирования для bytes if результат в известной кодировке):

def decode_escapes(s, encoding=None):
    if isinstance(s, str):
        if encoding is not None:
            return TypeError("Do not pass encoding for string arguments")
        # UTF-8 will allow correct interpretation of escapes when bytes form
        # interpreted as latin-1
        s = s.encode('utf-8')
        encoding = 'utf-8'
    decoded = s.decode('unicode_escape').encode('latin-1')
    if encoding is not None:
        # If encoding is provided, or we started with an arbitrary string, decode
        decoded = decode.decode(encoding)
    return decoded
1
ответ дан ShadowRanger 19 August 2018 в 08:44
поделиться
  • 1
    Большое спасибо, @ShadowRanger! Теперь он работает отлично! Возможно ли также правильно декодировать смайлики? – Guilherme Henrique Mendes 18 August 2018 в 03:54
  • 2
    @GuilhermeHenriqueMendes: Должно работать отлично на emoji, это всего лишь очередной порядковый номер Unicode. – ShadowRanger 18 August 2018 в 04:01

Ниже приведен код, который должен работать для\n, который должен отображаться в строке.

import string

our_str = 'The String is \\n, \\n and \\n!'
new_str = string.replace(our_str, '/\\n', '/\n', 1)
print(new_str)
0
ответ дан Vignesh Ramsubbose 19 August 2018 в 08:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: