繁体   English   中英

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

[英]How do I extract the number at the beginning of a string in Python 3.7?

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

elt.text
'3 reviews'

但是,当我尝试在此处使用逻辑获取数字时- 从Python中的String中提取数字时 ,出现以下错误

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'

是否有更好的方法从字符串的开头获取数字?

正如该答案中的注释所示,在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*以允许一个空的数字匹配(但请注意,如果仍允许使用符号,则匹配一个孤独的-+号)。

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

number = int(elt.text[0])

或超过一位数:

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

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

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

至于为什么答案现在不起作用,我不确定。

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

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 ,然后try成功tryexcept响应。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM