Как указано в комментариях к этой заметке об ответе, в Python 3 filter
возвращает объект генератора фильтров, поэтому вы должны выполнить итерацию по нему и построить новую строку, прежде чем сможете вызвать int
:
>>> s = '3 reviews'
>>> filter(str.isdigit, s)
<filter object at 0x800ad5f98>
>>> int(''.join(filter(str.isdigit, s)))
3
Однако, как указывают другие ответы в той же теме, это вовсе не обязательно хороший способ выполнить работу:
>>> s = '3 reviews in 12 hours'
>>> int(''.join(filter(str.isdigit, s)))
312
Возможно, было бы лучше использовать средство сравнения регулярных выражений, чтобы найти число в начале строки. Затем вы можете решить, следует ли разрешить знаки (+
и -
) и начальные пробелы:
>>> import re
>>> m = re.match(r'\s*([-+])?\d+', s)
>>> m
<_sre.SRE_Match object; span=(0, 1), match='3'>
>>> m.group()
'3'
>>> int(m.group())
3
Теперь, если ваша строка содержит искаженное число, m
будет Нет, а если оно содержит знак, знак разрешается:
>>> m = re.match(r'\s*([-+])?\d+', 'not a number')
>>> print(m)
None
>>> m = re.match(r'\s*([-+])?\d+', ' -42')
>>> m
<_sre.SRE_Match object; span=(0, 5), match=' -42'>
>>> int(m.group())
-42
Если вы хотите проверить, что идет после числа, во всяком случае, добавьте больше к регулярному выражению (включая некоторые скобки для группировки) и используйте m.group(1)
, чтобы получить совпавшее число. Замените \d+
на \d*
, чтобы разрешить пустое совпадение чисел, если это имеет смысл (но при этом следует помнить о совпадении с одиночным знаком -
или +
, если вы все еще допускаете знаки).