Есть строка
x = '1a\u0398\t\u03B43s'
Как подсчитать его длину только с помощью кода?
Я имею в виду, что добавлять перед строкой r
вручную бесполезно.
(x = r'1a\u0398\t\u03B43s'
).
Попробовали это решение, но все равно ничего хорошего (оно считает 9 символов, а должно быть 18):
x = '1a\\u0398\\t\\u03B43s'
decoded_s = x.encode().decode('unicode_escape')
print(f'Symbols: {len(decoded_s)}'))
возвращается 9
s = x.encode('unicode_escape')
дает Лен(ам) как 18
'1a\u0398\t\u03B43s'
и '1aΘ\tδ3s'
одинаковы. Первое означает второе. Ваша строка не содержит «обратную косую черту u ноль…», она содержит символ Θ. В каком конкретно случае вы не можете написать r'1a\u0398\t\u03B43s'
, но это должно означать '1a\\u0398\\t\\u03B43s'
?!
Поскольку вы не можете преобразовать его в необработанную строку, вы можете принудительно преобразовать представление байтов в строку следующим образом:
Вы хотите посчитать, что находится между одинарными кавычками:
>>> x.encode("unicode_escape")
b'1a\\u0398\\t\\u03b43s'
Преобразование в Python - это не то, что вам нужно:
>>> x.encode("unicode_escape").decode("unicode_escape")
'1aΘ\tδ3s'
вы можете принудительно преобразовать его в строку (в отличие от преобразования объекта в строку, описанного выше):
>>> str(x.encode("unicode_escape"))
"b'1a\\\\u0398\\\\t\\\\u03b43s'"
Отправьте вложение b'...'
:
>>> str(x.encode("unicode_escape"))[2:-1]
'1a\\\\u0398\\\\t\\\\u03b43s'
>>> len(str(x.encode("unicode_escape"))[2:-1])
21
Теперь с \
все немного сложнее - ваш необработанный запрос имеет 2 \\
, но, поскольку это не необработанная строка, он экранирует их все, поэтому, даже если вы видите 4 \\\\
, он считается 3 \\\
с простым len(...)
- поэтому вы хотите вычесть По 1 за каждое появление (правильно будет считаться 4 \\\\
).
>>> y = str(x.encode("unicode_escape"))[2:-1]
>>> len(y) - y.count("\\\\")
18
Как это связано с ожидаемым результатом 18?
хорошая мысль, я пропустил unicode_escape
Какой должна быть длина
'1aΘ\tδ3s'
?