Załóżmy, że mam ciąg będący wersją innego ciągu znaków, w której zastosowano znak ucieczki odwrotnym ukośnikiem. Czy w Pythonie jest łatwy sposób na usunięcie ciągu znaków? Mógłbym na przykład:
>>> escaped_str = '"Hello,\\nworld!"'
>>> raw_str = eval(escaped_str)
>>> print raw_str
Hello,
world!
>>>
Jednak wiąże się to z przekazaniem (prawdopodobnie niezaufanego) ciągu do eval (), co stanowi zagrożenie bezpieczeństwa. Czy w standardowej bibliotece znajduje się funkcja, która pobiera ciąg i tworzy ciąg bez wpływu na bezpieczeństwo?
print(b"Hello,\nworld!".decode('unicode_escape'))
value.encode('utf-8').decode('unicode_escape')
value.encode('utf-8').decode('unicode_escape')
psuje znaki spoza ASCII w ciągu . O ile nie gwarantuje się, że dane wejściowe zawierają tylko znaki ASCII, nie jest to prawidłowe rozwiązanie.Możesz użyć tego,
ast.literal_eval
który jest bezpieczny:Lubię to:
źródło
ast
biblioteka wymaga cytaty (albo"
albo'
nawet"""
czy'''
) wokół escaped_str, ponieważ jest rzeczywiście próbuje uruchomić go jako Pythona (wstrzyknięcie zapobiega smyczkowy) kod, ale zwiększa bezpieczeństwostr
jestrepr
astr
lubbytes
przedmiotem, jak w przypadku PO;unicode-escape
odpowiedź kodek jest, gdy nie jestrepr
, ale jakaś inna forma uciekła tekście (nie w cudzysłowie jako część danych łańcuchowych siebie).[ERROR] TypeError: string indices must be integers
a to rozwiązanie działało, aby go rozwiązać. Cofnij znakowanie ciągu, a następnie przeanalizuj go jako JSON.Wszystkie podane odpowiedzi będą łamać się na ogólnych ciągach Unicode. O ile wiem, poniższe działa dla Python3 we wszystkich przypadkach:
Jak zaznaczono w komentarzach, możesz również użyć
literal_eval
metody zast
modułu w następujący sposób:Lub w ten sposób, gdy twój ciąg naprawdę zawiera literał ciągu (w tym cudzysłowy):
Jeśli jednak nie masz pewności, czy ciąg wejściowy używa podwójnych, czy pojedynczych cudzysłowów jako separatorów, lub jeśli w ogóle nie możesz założyć, że jest on prawidłowo zmieniony ,
literal_eval
może to spowodowaćSyntaxError
, że metoda encode / decode będzie nadal działać.źródło
ast.literal_eval('"mon€y\\nröcks"') == "mon€y\nröcks"
działa dobrze dla mnie z Pythonem 3.7.3W Pythonie 3
str
obiekty nie majądecode
metody i musisz użyćbytes
obiektu. Odpowiedź ChristopheDa obejmuje Pythona 2.źródło
value.encode('utf-8').decode('unicode_escape')
.encode
?