【问题标题】:Parsing user input in Python在 Python 中解析用户输入
【发布时间】:2013-06-26 16:10:52
【问题描述】:

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

 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

【问题讨论】:

  • 看看这个relevant thread。大多数人会说使用正则表达式,但如果数字总是整数,还有更简单的方法。

标签: python parsing input numbers range


【解决方案1】:

正则表达式对我有用,将它们直接应用于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]

【讨论】:

  • 好的,如果-和数字是分开的,比如- 12312.. - 9
  • @chamini2 我用处理该案例的代码更新了我的答案
【解决方案2】:
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

首先使用..拆分,然后使用,

我认为这会有所帮助..

【讨论】:

    猜你喜欢
    • 2014-03-14
    • 2021-11-23
    • 2016-10-04
    • 1970-01-01
    • 2011-07-24
    • 2013-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多