Как извлечь число в начале строки в Python 3.7? - PullRequest
0 голосов
/ 05 января 2019

Я использую Python 3.7. У меня возникают трудности с извлечением числа из начала строки. Строка получена из элемента HTML, например,

elt.text
'3 reviews'

Однако, когда я пытаюсь получить число с помощью логики здесь - Извлечь число из строки в Python , я получаю ошибку ниже

int(filter(str.isdigit, elt.text))
Traceback (most recent call last):
  File "<input>", line 1, in <module>
TypeError: int() argument must be a string, a bytes-like object or a number, not 'filter'

Есть ли лучший способ получить число в начале строки?

Ответы [ 4 ]

0 голосов
/ 05 января 2019

есть более интуитивный способ сделать это. Я сделаю предположение и подумаю, что есть вероятность, что в данной строке появится более одного числа. Итак, вы хотите повторить слова ввода.

numbers = [int(s) for s in input_string.split(' ') if s.isdigit()]

Первым элементом списка является первое число, найденное в данной строке, оно доступно, если вынуть его из списка numbers[0].

Если вы уверены, и нет никакого шанса, что первый «элемент» входной строки - не что иное, как число, вы можете просто разделить строку на пробелы (или используемый вами разделитель) и привести ее на integer или float.

int(input_string.split(' ')[0]) or float(input_string.split(' ')[0])

Если вы не уверены, оберните его в try и возьмите ответ либо: try, либо except.

0 голосов
/ 05 января 2019

Вы можете изменить верхний ответ по ссылке, которую вы отправляете на это:

str1 = "3158 is a great number"
print(int("".join(filter(str.isdigit, str1))))
#3158

Что касается того, почему ответ не работает сейчас, я не уверен.

0 голосов
/ 05 января 2019

Как указано в комментариях к этой заметке об ответе, в 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*, чтобы разрешить пустое совпадение чисел, если это имеет смысл (но при этом следует помнить о совпадении с одиночным знаком - или +, если вы все еще допускаете знаки).

0 голосов
/ 05 января 2019

Самый простой способ, если число всегда находится в начале строки, учитывая, что это одна цифра:

number = int(elt.text[0])

Или для более чем одной цифры:

number = int(elt.text.split()[0])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...