【问题标题】:Cleanest way to obtain a list of the numeric values in a string获取字符串中数值列表的最简洁方法
【发布时间】:2016-07-15 16:37:29
【问题描述】:

获取字符串中数值列表的最简洁方法是什么?

例如:

string = 'version_4.11.2-2-1.4'
array  = [4, 11, 2, 2, 1, 4]

如你所见,我需要比较版本。

“最干净”是指尽可能简单/简短/可读。

另外,如果可能的话,我更喜欢内置函数而不是正则表达式 (import re)。

这是我目前得到的,但我觉得它比较笨拙:

array = [int(n) for n in ''.join(c if c.isdigit() else ' ' for c in string).split()]

奇怪的是,我一直无法在 SO 上找到答案:

谢谢

【问题讨论】:

    标签: python string


    【解决方案1】:

    只匹配连续的数字:

    map(int, re.findall(r'\d+', versionstring))
    

    数字之间的内容无关紧要; \d+ 匹配一行中可以找到的尽可能多的数字。这会在 Python 2 中为您提供所需的输出:

    >>> import re
    >>> versionstring = 'version_4.11.2-2-1.4'
    >>> map(int, re.findall(r'\d+', versionstring))
    [4, 11, 2, 2, 1, 4]
    

    如果您使用的是 Python 3,map() 会为您提供一个可迭代的 map 对象,因此请在上面调用 list() 或使用列表推导:

    [int(d) for d in re.findall(r'\d+', versionstring)]
    

    【讨论】:

    • 谢谢。我正在使用 Python 2。所以我认为(也来自所有其他答案)内置函数无法实现更多功能,而 re 是最干净的解决方案。对吗?
    • @barakmanos re 是标准库的一部分,将其视为内置。这是针对您的特定问题的最干净的解决方案,是的。
    【解决方案2】:

    我也会用正则表达式来解决这个问题。

    我更喜欢 re.finditer 而不是 re.findall 来完成这项任务。 re.findall 返回一个列表,re.finditer 返回一个迭代器,因此使用此解决方案您不会创建临时字符串列表:

    >>> [int(x.group()) for x in re.finditer('\d+', string)]
    [4, 11, 2, 2, 1, 4]
    

    【讨论】:

      【解决方案3】:

      正如@MartijnPieters 的回答清楚地表明,正则表达式绝对是最好的方法,但如果你不想使用它,你可能不能使用列表理解。不过,您可以这样做:

      def getnumbers(string):
          numberlist = []
          substring = ""
          for char in string:
              if char.isdigit():
                  substring += char
              elif substring:
                  numberlist.append(int(substring))
                  substring = ""
          if substring:
              numberlist.append(int(substring))
          return numberlist
      

      【讨论】:

      • 我认为这并不比我已经回答的要好多少。无论如何,谢谢。
      • 你需要测试余数;你会错过字符串中的最后一个数字,除非它后面是非数字。
      • @MartijnPieters:这是一个我没有注意到的错误,但现在已修复。谢谢。
      【解决方案4】:

      您正在跟踪每个字符并检查它是否是数字,如果是,则将其添加到列表中,对于较大的字符串会变慢。

      比方说,

        import re
          string='version_4.11.2-2-1.4.9.7.5.43.2.57.9.5.3.46.8.5'
          l=map(int, re.findall('\d+',string))
          print l
      

      希望这应该可行。 在上面的答案中不确定我们为什么使用'r'。

      【讨论】:

        【解决方案5】:

        您可以使用正则表达式简单地解决此问题。

        import re
        string = 'version_4.11.2-2-1.4'
        p=re.compile(r'\d+')
        p.findall(string)
        

        【讨论】:

          猜你喜欢
          • 2016-06-22
          • 1970-01-01
          • 2016-09-12
          • 2017-05-25
          • 2010-09-27
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多