我正在从HackerRank进行算法挑战,其中一个问题需要我以数字字符串的形式接受输入,格式如下:
3 4
12 14 16
1 2
3 4
5 6
现在,我知道如何遍历这些行并将它们分配到需要去的地方,但我的问题在于第二行。其他的是两个两位数字,所以我只是通过在字符串中引用它们的索引来提取它们。例如,第一行数字将使用字符串[0]和字符串[-1]收集。
然而,第二行具有不确定的长度,并且可以包括短于或长于三位的数字。我如何将它们拉出来并将它们分配给变量?我确定可能有一种方法可以使用RegEx,但我不知道如何将一个字符串中的多个匹配分配给多个变量。
答案 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]