Найти - Пользователи
Полная версия: преобразование строки ASCI в число
Начало » Python для новичков » преобразование строки ASCI в число
1
sovuschka
получаю ответ от устройства в кодах ASCI а работать нужно с числом, получаемым
y = b'81050026:\r\n' # это приходит,
print(y) # печатаю, то, с чем работать
>>>
b'81050026'

а мне нужно получить это в числовом виде, а не байтовой строкой.

Как преобразовать ?? подскажите пожалуйста
terabayt
ну учитывая двоеточие что стоит после числа
>>> y = b'81050026:\r\n'
>>> a = int(y.rstrip()[:-1])
>>> a
81050026
sovuschka
Все работало пока не пришел вот такой код…
>>> y = b'- 254:\r\n' # – между знаком ‘-’ и числом ‘254’ пробелы в количестве 4 штук, редактор форума сокращает

JOHN_16
Можно воспользоваться регулярными выражениями, что бы искать в строке только допустимые символы. Вот небольшой тестовый пример , но регулярное выражение наверняка можно лучше написать, более универсальное.
>>> import re
>>> s='81050026:\r\n'
>>> int(''.join(re.findall('(?:[-\d])', s)))
81050026
>>> s='- 254:\r\n'
>>> int(''.join(re.findall('(?:[-\d])', s)))
-254
sovuschka
дело в том, что у меня приходит
y = b'81050026:\r\n'
это байтовая строка и если я сделаю

>>> import re
>>> s=b'81050026:\r\n'
>>> int(''.join(re.findall('(?', s)))
Traceback (most recent call last):
File “<pyshell#11>”, line 1, in <module>
int(''.join(re.findall('(?', s)))
File “C:\Python34\lib\re.py”, line 210, in findall
return _compile(pattern, flags).findall(string)
TypeError: can't use a string pattern on a bytes-like object
JOHN_16
Переведите ее из байтов в строку:
>>> import re
>>>
>>> s=b'81050026:\r\n'
>>> s=s.decode()
>>>
>>> int(''.join(re.findall('(?:[-\d])', s)))
81050026
>>>
>>> type(s)
<class 'str'>
>>>
py.user.next
JOHN_16
re.findall('(?:[-\d])', s)
А зачем там (?: … ) ? Чтобы он вернул список строк, а не кортежей?

>>> import re
>>> 
>>> re.findall(r'[ab]', 'abcabcabc')
['a', 'b', 'a', 'b', 'a', 'b']
>>>

JOHN_16
Переведите ее из байтов в строку:
Можно не переводить, re поддерживает работу с байтовыми объектами.

>>> import re
>>> 
>>> re.findall(br'[ab]', b'abcabcabc')
[b'a', b'b', b'a', b'b', b'a', b'b']
>>>

sovuschka
получаю ответ от устройства в кодах ASCI а работать нужно с числом
Сделай функцию очистки от ненужных символов. То есть получил, почистил, превратил в число, применил.
А на чём она там будет базироваться, на re или не на re - это неважно.
JOHN_16
py.user.next
А зачем там (?: … ) ? Чтобы он вернул список строк, а не кортежей?
я почти ноль в регулярках :) не шутка. Не даются мне они, если что то и делается то со скрипом и болью
py.user.next
JOHN_16
Не даются мне они, если что то и делается то со скрипом и болью
Эта ошибка (лишняя незахватывающая группа) с регулярными выражениями не связана. Нужно разделять регулярные выражения и функции, которые их принимают. В частности, здесь пробел в понимании поведения функции re.findall(), а не того, как устроено регулярное выражение.

Сам изучал регекспы по документации к третьему python.org. re
Если бы ты это читал, то в описании к \d увидел бы
\d
For Unicode (str) patterns:
Matches any Unicode decimal digit (that is, any character in Unicode character category [Nd]). This includes [0-9], and also many other digit characters. If the ASCII flag is used only [0-9] is matched (but the flag affects the entire regular expression, so in such cases using an explicit [0-9] may be a better choice).
For 8-bit (bytes) patterns:
Matches any decimal digit; this is equivalent to [0-9].
что там есть два вида шаблонов - юникодовые и байтовые.

Так вот функции в питоне работают так, как свойственно питону; это не общемировая практика. Поэтому их надо изучать, чтобы понимать, что авторы задумали. Функция re.findall(), например, ищет совпадение с регулярным выражением так же, как и любая другая программа в мире, но после того, как она нашла, она уже делает что-то своё, задуманное авторами.
sovuschka
py.user.next
Так и сделал…
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB