【问题标题】:Extract multi-digit numbers from a string in python 3从python 3中的字符串中提取多位数字
【发布时间】:2014-08-21 14:39:18
【问题描述】:

我正在做来自 HackerRank 的算法挑战,其中一个问题需要我接受格式如下的数字字符串形式的输入:

3 4
12 14 16
1 2
3 4
5 6

现在,我知道如何遍历这些行并将它们分配到需要去的地方,但我的问题在于第二行。其他的是两个两位数,所以我只是通过在字符串中引用它们的索引来提取它们。例如,第一行数字将使用 string[0] 和 string[-1] 收集。

但是,第二行的长度不确定,可能包含短于或长于三位数的数字。我将如何将它们拉出来并将它们分配给变量?我确信可能有一种使用 RegEx 的方法,但我不知道如何将一个字符串中的多个匹配项分配给多个变量。

【问题讨论】:

  • 你为什么不在空格上split(" ") 然后遍历结果呢?在这里使用正则表达式似乎有点矫枉过正
  • 是的。呃。今天就是这样的日子之一。我只是在其他更复杂的解决方案上花了大约 45 分钟...谢谢!
  • 这些线条有什么意义吗?即,你想要[3,4,12,14, 16,...] 还是[[3, 4], [12, 14, 16], ...]

标签: regex string python-3.x numbers


【解决方案1】:
  import re
  print re.findall(r"(\d+)",x)

"x" 是你的行。这将返回一个包含所有数字的列表。

【讨论】:

    【解决方案2】:

    你是说这个吗?

    >>> import re
    >>> s = """3 4
    ... 12 14 16
    ... 1 2
    ... 3 4
    ... 5 6"""
    >>> m = re.findall(r'\b\d+\b', s, re.M)
    >>> m
    ['3', '4', '12', '14', '16', '1', '2', '3', '4', '5', '6']
    

    只需选取最终列表中的每个值并将其分配给变量即可。

    【讨论】:

      【解决方案3】:

      所以如果s 是你的字符串,

      map(int, s.split())
      

      产生一个整数列表:

      [3, 4, 12, 14, 16, 1, 2, 3, 4, 5, 6]
      

      这基本上是 skamazin 建议的。

      【讨论】:

        【解决方案4】:

        给定:

        >>> txt='''\
        ... 3 4
        ... 12 14 16
        ... 1 2
        ... 3 4
        ... 5 6'''
        

        如果这些行有意义,你可以这样做:

        >>> [map(int, line.split()) for line in txt.splitlines()]
        [[3, 4], [12, 14, 16], [1, 2], [3, 4], [5, 6]]
        

        如果这些行没有意义,你只想要所有的数字,你可以这样做:

        >>> map(int, txt.split())
        [3, 4, 12, 14, 16, 1, 2, 3, 4, 5, 6]
        

        如果您的源文本可能包含不会转换为整数的字符串:

        >>> txt='''\
        ... 3 4
        ... 12 14 16
        ... 1 2
        ... 3 4
        ... 5 6
        ... text that won't be integers
        ... 99 100 101'''
        

        你可以使用转换函数:

        >>> def conv(s):
        ...    try:
        ...       return int(s)
        ...    except ValueError:
        ...       return s
        ... 
        >>> [[conv(s) for s in line.split()] for line in txt.splitlines()]
        [[3, 4], [12, 14, 16], [1, 2], [3, 4], [5, 6], ['text', 'that', "won't", 'be', 'integers'], [99, 100, 101]]
        

        或者过滤掉不是数字的东西:

        >>> map(int, filter(lambda s: s.isdigit(), txt.split()))
        [3, 4, 12, 14, 16, 1, 2, 3, 4, 5, 6, 99, 100, 101]
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多