2011-01-28 5 views

ответ

21

Если ваш язык регулярных выражений Perl-совместимый: \d{15}.

Трудно сказать, как обрабатывать края (чтобы вы случайно не захватили дополнительные цифры), не зная внешнего контекста, в котором этот фрагмент будет использоваться. Окончательное контекстно-независимое решение заключается в следующем:

(?:(?<!\d)\d{15}(?!\d)) 

Вы можете поместить это в середине любого регулярного выражения, и он будет соответствовать (и только матчу) последовательность ровно 15 цифр. Это, однако, довольно неудобно и обычно не нужно. Более простой вариант, который предполагает не буквенно-цифровые границы (например, пробелы вокруг цифр) заключается в следующем:

(?:\b\d{15}\b) 

Но это не будет работать, если буквы непосредственно перед или после последовательности.

В обоих случаях наружные (?: ... ) - это всего лишь конструкция брекетинга, чтобы избежать проблем с приоритетом с окружающим регулярным выражением. Требуется ли это также зависит от контекста.

+0

Использование встроенной библиотеки регулярных выражений python. – MrGlass

+0

Тогда это сработает. –

27

Как правило, вы можете сделать диапазоны следующим образом:

\d{4,7} 

, что означает, как минимум 4 и максимум 7 цифр. Для вашего конкретного случая вы можете использовать вариант с одним аргументом, \d{15}.

Обе эти формы поддерживаются в Python's regular expressions - найдите текст {m,n} по этой ссылке.

И имейте в виду, что \d{15} будет соответствовать пятнадцати цифрам в любой точке линии, включая 400-значное число. Если вы хотите, чтобы убедиться, что он имеет только пятнадцать, можно использовать что-то вроде:

^\d{15}$ 

который использует начальные и конечные якоря или

^\D*\d{15}\D*$ 

, который позволяет произвольно нецифровые с обеих сторон.

+0

Nevermind, я неправильно протестировал – MrGlass

+2

Если вам нужно ровно 15, вам нужно закрепить: например, искать '^ \ d {15} $', что гарантирует, что с каждой стороны ничего нет - он будет принимать только строку ровно 15 символы длинны, причем все символы являются цифрами. – paxdiablo

+0

Да, это была моя проблема - я забыл привязать свои тесты. – MrGlass

0

Есть два способа, которыми я располагаю, чтобы ограничить числа.

с использованием Len,

num = 1234 
len(str(num)) <= 4 

Этот выход будет True/False.

используя регулярное выражение,

import re 
num = 12324 
re.match(r'(?:(?<!\d)\d{4}(?!\d))', str(num)) 

выход будет объект регулярного выражения или Нет.

Смежные вопросы