Python регулярное выражение для целого числа? - PullRequest
21 голосов
/ 21 декабря 2011

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

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

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

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

Ответы [ 4 ]

75 голосов
/ 21 декабря 2011

Regexp работает на базе символов, а \d означает одну цифру 0 ... 9, а не десятичное число.

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

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

означает

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

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

13 голосов
/ 21 декабря 2011

Вам необходимо привязать регулярное выражение в начале и конце строки:

^[0-9]+$

Пояснение:

^      # Start of string
[0-9]+ # one or more digits 0-9
$      # End of string
8 голосов
/ 21 декабря 2011

Вы, очевидно, используете Django.

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

2 голосов
/ 31 декабря 2017

Я предпочитаю ^[-+]?([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'))
...