Разрешены только числа с плавающей запятой, с одной десятичной запятой И ОТРИЦАТЕЛЬНЫЙ ЗНАК (Python / Kivy / Regex) - PullRequest
3 голосов
/ 21 июня 2020

Во-первых, я хотел бы сказать, что я новичок в этом языке, но уже довольно глубоко изучил свое приложение-калькулятор для простых уравнений физики. Мой план состоит в том, чтобы сначала создать домашний экран с еще одним экраном вычислений, и как только он станет настолько хорошим, насколько я смогу его получить, я перейду к остальным экранам.

На этом конкретном экране (и, вероятно, большинство других мне придется использовать эту функцию) Я установил собственный TextInput, который допускает только числа 0–9 и одну десятичную точку. Однако сейчас я ломаю себе голову, пытаясь выяснить, как включить ОТРИЦАТЕЛЬНЫЙ ЗНАК в разрешенный набор входных данных.

Вот код: (Я нашел его с открытым исходным кодом, я понимаю логистику, но Я еще не полностью понял функцию re.compile)

class FloatInput(TextInput):

    pat = re.compile('[^0-9]') <----THIS IS WHERE I TRIED TO ADD ^[+-]? w/ NO LUCK :(
    def insert_text(self, substring, from_undo=False):

        pat = self.pat

        if '.' in self.text:
            s = re.sub(pat, '', substring)


        else:
            s = '.'.join([re.sub(pat, '', s) for s in substring.split('.', 1)])


        return super(FloatInput, self).insert_text(s, from_undo=from_undo)

Ответы [ 2 ]

3 голосов
/ 21 июня 2020

Из Python do c 'n для модуля re :

Если - экранирован (например, [a\-z]) или если он помещен как первый или последний символ (например, [-a] или [a-]), он будет соответствовать литералу '-'.

Чтобы получить шаблон, который соответствует чему угодно, кроме 0-9, - или + , вы можете использовать

pat = re.compile('[^0-9\-+]')
1 голос
/ 21 июня 2020

Вместо того, чтобы заменять нерелевантные символы в строке, хотите ли вы рассмотреть, вводит ли пользователь число в правильном формате?

Если да, попробуйте с помощью re.match и проверки пользователя ввести правильный форматируйте, пока он не станет правильным.

Попробуйте этот код, чтобы он соответствовал вашему требованию -ve чисел с плавающей запятой

re.match('^-{0,1}[0-9]*(.[0-9]+){0,1}$', '-1.1000008')

Я попробовал пару отрицательных примеров и проверил. Пожалуйста, не стесняйтесь изменять, если что-то отсутствует.

Пара информации относительно этой строки регулярного выражения

^ -> starts with
$ -> ends with
{0,1} -> 0 - 1 occurrence only
* -> Zero or more times
+ -> One or more times
() -> group

Вы также можете поместить эту строку в re.compile. Выходы re.match совпадают, если есть, иначе Нет

Ура,

...