从python 3中的字符串中提取多位数字

时间:2014-08-21 14:39:18

标签: regex string python-3.x numbers

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

3 4
12 14 16
1 2
3 4
5 6

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

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

4 个答案:

答案 0 :(得分:1)

  import re
  print re.findall(r"(\d+)",x)

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

答案 1 :(得分:0)

你是说这个?

>>> 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']

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

答案 2 :(得分:0)

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

map(int, s.split())

产生一个整数列表:

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

这基本上是skamazin建议的。

答案 3 :(得分:0)

假设:

>>> 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]