在Python 3中从字符串中提取多位数字

3
我正在从HackerRank完成算法挑战,其中一个问题需要我接受以下格式的数字字符串作为输入:

3 4
12 14 16
1 2
3 4
5 6

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

然而,第二行的长度不确定,可能包含比三位数字短或长的数字。我应该如何提取它们并将它们分配到变量中?我相信可能有一种使用正则表达式的方法,但我不知道如何将一个字符串中的多个匹配项分配给多个变量。


为什么不直接在空格上使用 split(" "),然后遍历结果呢?在这里使用正则表达式似乎有些过度。 - skamazin
1
是的。嗯。今天就是那种日子。我刚刚花了大约45分钟在其他更复杂的解决方案上...谢谢! - user2448416
这些行有任何意义吗?例如,你想要 [3,4,12,14, 16,...] 还是 [[3, 4], [12, 14, 16], ...] - dawg
4个回答

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

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

0

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

map(int, s.split())

返回一个整数列表:

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

这基本上就是skamazin所建议的。


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]

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接