我正在使用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'
是否有更好的方法从字符串的开头获取数字?
答案 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]
中删除。
如果您确定并且输入字符串的第一个“元素”不是数字而是别的,则可以将字符串按空格(或使用的分隔符)分割并进行转换到integer
或float
。
int(input_string.split(' ')[0]) or float(input_string.split(' ')[0])
如果不确定,请将其包装在try
中,并获取成功的try
或except
的响应。