【问题标题】:Given a string, best way in Python to extract all integers in the string给定一个字符串,Python 中提取字符串中所有整数的最佳方法
【发布时间】:2016-06-05 13:40:11
【问题描述】:

给定一个未知格式的字符串,但预期包含已知数量的整数,我想将这些整数提取为List,或者如果整数数量与预期不匹配则返回错误。

例如,如果字符串读取'This is a test 1 2 3 55',并且预期的整数个数是4,它应该返回[1, 2, 3, 55]

如果字符串读取'(1 2 3 55)',并且预期的整数个数是6,它应该返回一个错误。

在其他语言中,我会将所有空格或标点符号拆分成单词,测试每个单词的数字状态,并丢弃未通过测试的单词,但我是 Python 新手,我很好奇是否有更好的接近。

【问题讨论】:

  • 您能否展示您自己的 Python 方法并参考您的代码尝试解释您遇到了什么困难?
  • 你做了哪些研究来尝试解决这个问题?

标签: python regex text


【解决方案1】:

你可以使用正则表达式 -

import re

s = 'This is a test 1 2 3 55'

expr = r'\d+'

print(list(map(int, re.findall(expr, s))))

如果您不想使用正则表达式,这也可以 -

s = 'This is a test 1 2 3 55'

arr = [int(x) for x in s.split() if x.isdigit()]

print(arr)

输出 -

[1, 2, 3, 55]

正如 Michael Stern 评论的那样,如果您的输入字符串包含 floatsintstr 的混合(如“55ab9”),并且您想忽略它们,那么第一种方法将不起作用。您应该将其按空格分隔并将每个元素与正则表达式 r'^\d+$' 匹配。

【讨论】:

  • 这种方法的问题在于,它将 11.2 识别为 [11, 2],而我会将其标记为不是整数。
  • @MichaelStern 我已经解决了您的问题。
【解决方案2】:

我会使用过滤器来获取整数。我们正在拆分的字符串(这是一个列表)中搜索整数。

In [55]: s = 'This is a test 1 2 3 55'
In [56]: list(filter(lambda x: x.isdigit(), s.split()))
Out[56]: ['1', '2', '3', '55']

【讨论】:

    【解决方案3】:

    由于这很简单,所以按空格分割比使用正则表达式更好。

    以下是可以满足您要求的程序。如果您将预期计数从 4 更改为任何其他数字,它将按照您的指定抛出错误。

     strdata='This is a test 1 2 3 55'
     num=[]
     expected_count=4
     for i in strdata.split():
        if i.isdigit():
                num.append(i)
     if len(num)==expected_count:
        print num
     else:
        raise ValueError('Numbers count not as expected')
    

    【讨论】:

    • 该方法的问题在于,如果字符串采用 '1, 2, 3, 4' 的形式,前三个整数将不会触发 is digit() 测试,因为它们的尾随逗号。
    猜你喜欢
    • 2021-10-04
    • 2011-11-21
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 2019-03-03
    • 2011-02-07
    • 2013-12-21
    • 1970-01-01
    相关资源
    最近更新 更多