Форум сайта python.su
0
получаю ответ от устройства в кодах ASCI а работать нужно с числом, получаемым
y = b'81050026:\r\n' # это приходит,
print(y) # печатаю, то, с чем работать
>>>
b'81050026'
а мне нужно получить это в числовом виде, а не байтовой строкой.
Как преобразовать ?? подскажите пожалуйста
Отредактировано sovuschka (Март 18, 2015 10:03:20)
Офлайн
103
ну учитывая двоеточие что стоит после числа
>>> y = b'81050026:\r\n' >>> a = int(y.rstrip()[:-1]) >>> a 81050026
Офлайн
0
Все работало пока не пришел вот такой код…
>>> y = b'- 254:\r\n' # – между знаком ‘-’ и числом ‘254’ пробелы в количестве 4 штук, редактор форума сокращает
Отредактировано sovuschka (Март 18, 2015 10:10:00)
Офлайн
221
Можно воспользоваться регулярными выражениями, что бы искать в строке только допустимые символы. Вот небольшой тестовый пример , но регулярное выражение наверняка можно лучше написать, более универсальное.
>>> import re >>> s='81050026:\r\n' >>> int(''.join(re.findall('(?:[-\d])', s))) 81050026 >>> s='- 254:\r\n' >>> int(''.join(re.findall('(?:[-\d])', s))) -254
Офлайн
0
дело в том, что у меня приходит
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
Офлайн
221
Переведите ее из байтов в строку:
>>> import re >>> >>> s=b'81050026:\r\n' >>> s=s.decode() >>> >>> int(''.join(re.findall('(?:[-\d])', s))) 81050026 >>> >>> type(s) <class 'str'> >>>
Офлайн
857
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 а работать нужно с числом
Отредактировано py.user.next (Март 18, 2015 23:36:13)
Офлайн
221
py.user.nextя почти ноль в регулярках :) не шутка. Не даются мне они, если что то и делается то со скрипом и болью
А зачем там (?: … ) ? Чтобы он вернул список строк, а не кортежей?
Офлайн
857
JOHN_16Эта ошибка (лишняя незахватывающая группа) с регулярными выражениями не связана. Нужно разделять регулярные выражения и функции, которые их принимают. В частности, здесь пробел в понимании поведения функции re.findall(), а не того, как устроено регулярное выражение.
Не даются мне они, если что то и делается то со скрипом и болью
\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].
Отредактировано py.user.next (Март 19, 2015 06:44:52)
Офлайн
0
py.user.next
Так и сделал…
Офлайн