【问题标题】:How to get integer values from a string in Python?如何从 Python 中的字符串中获取整数值?
【发布时间】:2012-07-05 13:19:39
【问题描述】:

假设我有一个字符串

string1 = "498results should get" 

现在我只需要从像498 这样的字符串中获取整数值。这里我不想使用list slicing,因为整数值可能会像这些示例一样增加:

string2 = "49867results should get" 
string3 = "497543results should get" 

所以我只想以完全相同的顺序从字符串中获取整数值。我的意思是分别来自string1,string2,string3498,49867,497543

谁能用一两行告诉我如何做到这一点?

【问题讨论】:

    标签: python string integer


    【解决方案1】:

    这种方法使用列表推导,只需将字符串作为参数传递给函数,它将返回该字符串中的整数列表。

    def getIntegers(string):
            numbers = [int(x) for x in string.split() if x.isnumeric()]
            return numbers
    

    这样

    print(getIntegers('this text contains some numbers like 3 5 and 7'))
    

    输出

    [3, 5, 7]
    

    【讨论】:

      【解决方案2】:

      使用python 3.6,这两行返回一个列表(可能为空)

      >>[int(x) for x in re.findall('\d+', your_string)]
      

      类似于

      >>list(map(int, re.findall('\d+', your_string))
      

      【讨论】:

        【解决方案3】:
        def function(string):  
            final = ''  
            for i in string:  
                try:   
                    final += str(int(i))   
                except ValueError:  
                    return int(final)  
        print(function("4983results should get"))  
        

        【讨论】:

        • 不知道为什么你必须这样做 return int(final) 只是返回 return final 也可以。
        • 你能解释一下是什么让它只带数字吗?
        【解决方案4】:

        这是你的单线,不使用任何正则表达式,有时会变得很昂贵:

        >>> ''.join(filter(str.isdigit, "1234GAgade5312djdl0"))
        

        返回:

        '123453120'
        

        【讨论】:

          【解决方案5】:

          如果您有多组数字,那么这是另一种选择

          >>> import re
          >>> print(re.findall('\d+', 'xyz123abc456def789'))
          ['123', '456', '789']
          

          但它不适合浮点数字符串。

          【讨论】:

            【解决方案6】:
            >>> import re
            >>> string1 = "498results should get"
            >>> int(re.search(r'\d+', string1).group())
            498
            

            如果字符串中有多个整数:

            >>> map(int, re.findall(r'\d+', string1))
            [498]
            

            【讨论】:

            • 这不完全正确,是的,它会为字符串 starting 使用整数,但如果整数在字符串的中间,它不会这样做。也许使用int(re.search(r'\d+', string1).group()) 应该会更好
            • 如果 string1(020) 3493,则失败。
            • 是的,这是错误的代码,应该使用re.search
            • @Hussain 好吧,这个例子只显示了前面的数字,但无论如何现在它都是安全的
            • 这可以正常工作。但是,应该检查re.search 的结果是否不是None。否则,如果在访问.group() 后字符串中没有数字,它将抛出 AttributeError ('NoneType' object has no attribute 'group')。
            【解决方案7】:

            来自ChristopheD 的答案:https://stackoverflow.com/a/2500023/1225603

            r = "456results string789"
            s = ''.join(x for x in r if x.isdigit())
            print int(s)
            456789
            

            【讨论】:

              【解决方案8】:
              >>> import itertools
              >>> int(''.join(itertools.takewhile(lambda s: s.isdigit(), string1)))
              

              【讨论】:

              • 这仅在数字位于字符串开头时才有效。另外,为什么不使用 str.isdigit 而不是 lambda?
              • 这也可以写成int(''.join(itertools.takewhile(str.isdigit, string1)))。我永远不会真正使用任何一种方法,因为这太复杂了。
              • 我正在为字符串长度为数千个字符的情况提前计划。
              【解决方案9】:

              迭代器版本

              >>> import re
              >>> string1 = "498results should get"
              >>> [int(x.group()) for x in re.finditer(r'\d+', string1)]
              [498]
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 1970-01-01
                • 2016-06-09
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2012-12-11
                相关资源
                最近更新 更多