2

我需要解析来自用户的输入,使其具有以下格式之一:

 1321 .. 123123

或者

 -21323 , 1312321

一个数字(可以是负数),一个逗号,或两个点..,然后是另一个数字(可以是负数)。

此外,第一个数字必须小于或等于<=第二个数字。

如果输入未能具有此格式,请再次询问用户输入。

我有

def ask_range():
    raw = raw_input()
    raw = raw.strip(' \t\n\r')
    raw = map((lambda x: x.split("..")), raw.split(","))
    raw = list(item for wrd in raw for item in wrd)
    if len(raw) != 2:
        print "\nexpecting a range value, try again."
        return ask_range()

我不知道如何得到正确的数字。


编辑

我在答案的帮助下提出的解决方案是:

def ask_range():
    raw = raw_input()
    raw = raw.strip(' \t\n\r')
    raw = re.split(r"\.\.|,", raw)
    if len(raw) != 2:
        print "\nexpecting a range value, try again."
        return ask_range()

    left = re.match(r'^\s*-?\s*\d+\s*$', raw[0])
    right = re.match(r'^\s*-?\s*\d+\s*$', raw[1])
    if not (left and right):
        print "\nexpecting a range value, try again."
        return ask_range()

    left, right = int(left.group()), int(right.group())
    if left > right:
        print "\nexpecting a range value, try again."
        return ask_range()

    return left, right
4

2 回答 2

3

正则表达式对我有用,将它们直接应用于raw_input(). 例如:

import re
s1 = '1321 .. 123123'
s2 = '-21323 , 1312321'
s3 = '- 12312.. - 9'

[int(x) for x in re.findall(r'[^,.]+', ''.join(s1.split()))]
=> [1321, 123123]

[int(x) for x in re.findall(r'[^,.]+', ''.join(s2.split()))]
=> [-21323, 1312321]

[int(x) for x in re.findall(r'[^,.]+', ''.join(s3.split()))]
=> [-12312, -9]
于 2013-06-26T16:14:42.003 回答
0
def ask_range():
        raw = raw_input()
        lis = []
        split1 = raw.split("..")
        for i in split1:
            try:
                lis.append(int(i))
            except:
                for j in i.split(","):
                    list.append(int(j))
        if len(raw) != 2:
            print "\nexpecting a range value, try again."
            return ask_range()
        return lis

..首先使用then拆分,

我认为这会有所帮助..

于 2013-06-26T16:16:01.020 回答