Подтвердить что ты не робот

Регулярное выражение Python для целого?

Я изучаю регулярные выражения, и я хотел бы использовать регулярное выражение в Python для определения только целых чисел - целых чисел, но не десятичных.

Я мог бы сделать тот, который позволяет только числа, используя \d, но он также разрешает десятичные числа, которые я не хочу:

price = TextField(_('Price'), [
    validators.Regexp('\d', message=_('This is not an integer number, please see the example and try again')),
    validators.Optional()]) 

Как я могу изменить код, чтобы разрешить только целые числа?

4b9b3361

Ответ 1

Регулярные выражения работают с символьной базой, и \d означает одну цифру 0... 9 а не десятичное число.

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

^[-+]?[0-9]+$

имея в виду

  1. ^ - начало строки
  2. [-+]? - необязательный (это что ? означает) знак минус или плюс
  3. [0-9]+ - одна или несколько цифр (плюс означает "одна или несколько", а [0-9] - другой способ сказать \d)
  4. $ - конец строки

Примечание: если считать знак частью номера, то это нормально, только если вам нужно разобрать только номер. Для более общих синтаксических анализаторов, обрабатывающих выражения, лучше оставить знак вне числа: в противном случае исходные потоки, такие как 3-2 могут в конечном итоге быть проанализированы как последовательность из двух целых чисел вместо целого числа, оператора и другого целого числа. Мой опыт показывает, что отрицательные числа лучше обрабатываются постоянным сворачиванием оператора унарного отрицания на более высоком уровне.

Ответ 2

Вам нужно anchor регулярное выражение в начале и конце строки:

^[0-9]+$

Объяснение:

^      # Start of string
[0-9]+ # one or more digits 0-9
$      # End of string

Ответ 3

По-видимому, вы используете Django.

Скорее всего, вам лучше использовать models.IntegerField() вместо models.TextField(). Он будет не только проверять вас, но и даст вам сообщение об ошибке, переведенное в несколько языков, и он будет трансформировать значение из его типа в базу данных в тип вашего кода Python.

Ответ 4

Я предпочитаю ^[-+]?([1-9]\d*|0)$, потому что ^[-+]?[0-9]+$ позволяет строку, начинающуюся с 0.

RE_INT = re.compile(r'^[-+]?([1-9]\d*|0)$')


class TestRE(unittest.TestCase):
    def test_int(self):
        self.assertFalse(RE_INT.match('+'))
        self.assertFalse(RE_INT.match('-'))

        self.assertTrue(RE_INT.match('1'))
        self.assertTrue(RE_INT.match('+1'))
        self.assertTrue(RE_INT.match('-1'))
        self.assertTrue(RE_INT.match('0'))
        self.assertTrue(RE_INT.match('+0'))
        self.assertTrue(RE_INT.match('-0'))

        self.assertTrue(RE_INT.match('11'))
        self.assertFalse(RE_INT.match('00'))
        self.assertFalse(RE_INT.match('01'))
        self.assertTrue(RE_INT.match('+11'))
        self.assertFalse(RE_INT.match('+00'))
        self.assertFalse(RE_INT.match('+01'))
        self.assertTrue(RE_INT.match('-11'))
        self.assertFalse(RE_INT.match('-00'))
        self.assertFalse(RE_INT.match('-01'))

        self.assertTrue(RE_INT.match('1234567890'))
        self.assertTrue(RE_INT.match('+1234567890'))
        self.assertTrue(RE_INT.match('-1234567890'))