【问题标题】:How do I extract the number at the beginning of a string in Python 3.7?如何在 Python 3.7 中提取字符串开头的数字?
【发布时间】:2023-04-04 17:24:01
【问题描述】:

我正在使用 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'

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

【问题讨论】:

  • filter 返回一个迭代器,而不仅仅是您要查找的数字。您不能将 filter 转换为 int。错误是说int() argument must not be a 'filter' object

标签: python python-3.x string numbers


【解决方案1】:

正如该答案中的 cmets,在 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* 以允许空数字匹配,如果这有意义的话(但请注意匹配一个单独的 -+ 符号,如果您仍然允许符号)。

【讨论】:

    【解决方案2】:

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

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

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

    【讨论】:

      【解决方案3】:

      如果数字总是在字符串的开头,最简单的方法是,假设它是一个数字:

      number = int(elt.text[0])
      

      或多于一位:

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

      【讨论】:

      • 假设数字后面的字符是空格,这将起作用。可能是这样,但这在elt.text = "34x"这样的情况下不起作用
      • 是的,如果希望格式在所有情况下都相同,只是给出一个简单的方法。
      【解决方案4】:

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

      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 的响应。

      【讨论】:

        猜你喜欢
        • 2020-04-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-26
        • 1970-01-01
        • 2020-05-11
        相关资源
        最近更新 更多