2013-06-26 2 views
1

мне нужно для разбора ввода от пользователя, так что имеет один из следующих форматов:Синтаксический пользовательский ввод в Python

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() 

я не уверен, как получить номера правильно.


EDIT

Решение, которое я придумал с помощью из ответов:

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 
+1

проверить это [соответствующий] нить (http://stackoverflow.com/questions/4289331/Python-экстракт-число в своем строке). Большинство людей скажут использование регулярного выражения, но если числа всегда целые, есть более простые способы. – wflynny

ответ

2

Регулярные выражения работают для меня, применять их непосредственно к значению, возвращаемому 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] 
+0

Хорошо, и если '-' и число разделены, например ' - 12312 .. - 9' – chamini2

+0

@ chamini2 Я обновил свой ответ с кодом для обработки этого случая –

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 

Первый раскол, используя .. затем ,

Я думаю, что это поможет ..