如何在Python 3.7中提取字符串开头的数字?

时间:2019-01-04 21:44:12

标签: python python-3.x string numbers

我正在使用Python 3.7。我很难从字符串的开头提取数字。字符串是从HTML元素派生的,就像这样

elt.text
'3 reviews'

但是,当我尝试使用此处的逻辑获取数字-Extract Number from String in 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 :(得分:2)

作为该答案注释的注释,在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将为None,并且如果包含符号,则允许使用该符号:

>>> 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*以允许一个空的数字匹配(但请注意,如果仍允许使用符号,则匹配一个单独的-+符号)。

答案 1 :(得分:0)

如果数字始终位于字符串的开头,并且是一个数字,则是最简单的方法:

number = int(elt.text[0])

或超过一个数字:

number = int(elt.text.split()[0])

答案 2 :(得分:0)

您可以在发送给此链接的链接中修改最重要的答案:

a

关于为什么现在无法解决问题的答案,我不确定。

答案 3 :(得分:0)

有一种更直观的方法。我将做一个假设,并认为在给定的字符串中可能会出现多个数字。因此,您想迭代输入的单词。

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

列表的第一个元素是在给定字符串上找到的第一个数字,可以将其从列表numbers[0]中删除。

如果您确定并且输入字符串的第一个“元素”不是数字而是别的,则可以将字符串按空格(或使用的分隔符)分割并进行转换到integerfloat

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

如果不确定,请将其包装在try中,并获取成功的tryexcept的响应。