Python: получение целых из строки - PullRequest
0 голосов
/ 05 ноября 2011

Хорошо, поэтому я сделал метод в Python, который делает именно то, что я хочу, но он действительно уродлив и повторяется, все, что ему нужно сделать, это получить первые 4 целых числа в строке ввода и вернуть их в виде ((int1, int2), (int3, int4)).Должен быть лучший способ сделать это (возможно, даже в одной строке), используя понимание списка или что-то в этом роде.Любые идеи ??

def getMove(playerInput) :
nextNum = 0
x1 = 0
y1 = 0
x2 = 0
y2 = 0
for c in playerInput:
    try:
        if nextNum==0 :
            x1 = int(c)
            nextNum += 1
        elif nextNum==1 :
            y1 = int(c)
            nextNum += 1
        elif nextNum==2 :
            x2 = int(c)
            nextNum += 1
        elif nextNum==3 :
            y2 = int(c)
            nextNum += 1
        else :
            return ((x1,y1),(x2,y2))
    except ValueError:
        break

return ((x1,y1), (x2,y2))

Заранее благодарим за ваши полезные комментарии.

Ответы [ 3 ]

2 голосов
/ 05 ноября 2011

Вот то, что вы хотите, используя регулярное выражение и простое понимание списка.

Это довольно надежный и неприятный ввод.Он соответствует вашему запросу на «первые 4 целых числа в строке ввода», так как находит первые 4 целых числа на входе, разделенных ЛЮБЫМИ нечисловыми символами.

import re

def getMove(playerInput):
    m = re.search('([\d]+)[\D]*([\d]+)[\D]*([\d]+)[\D]*([\d]+)[\D]*', playerInput)
    if m:
        nums = [int(x) for x in m.groups()]
    else:
        raise ValueError("Invalid argument")
    return ((nums[0], nums[1]),(nums[2], nums[3]))

Примеры ввода / вывода:

Вход: "((12,5wf),(21,4xx))" Выход: ((12, 5), (21, 4))

Вход: "((0,1),(2,3))" Выход: ((0, 1), (2, 3))

Вход: " (0, 1),(2, 3)" Выход: ((0, 1), (2, 3))

Примечание: Это всегда будет стараться получить 4 числа, поэтому, если вместо значения ValueError вводится значение (12, 5, 4), он выберет 1, 2, 5 и 4.как числа.Если вы предъявляете более строгие требования к формату ввода, соответствие регулярного выражения можно настроить, чтобы избежать этой проблемы.Если я неправильно интерпретирую ваш формат ввода, дайте мне знать, и я могу исправить выражение, чтобы избежать такого поведения.

1 голос
/ 05 ноября 2011

Попробуйте это:

r = [int(c) for c in playerInput[:4]]
while len(r) < 4:
    r.append(0)
x1, y1, x2, y2 = r
return ((x1, y1), (x2, y2))
0 голосов
/ 05 ноября 2011

regexxy:

import re
def bla(playerInput):
    m = re.match('.*?(\d{1,4}).*', playerInput)
    if m != None:
        x1, x2, x3, x4 = [int(c) for c in m.group(1).ljust(4, '0')]
        return ((x1, x2), (x3, x4))
    else:
        raise Exception("invalid Input")

немного более терпимо, занимает от 1 до 4 цифр в строке и заполняется нулями.

...