52

I am looking to match a 15 digit number (as part of a larger regex string). Right now, I have

\d\d\d\d\d\d\d\d\d\d\d\d\d\d\d

but I feel like there must be a cleaner way to do this.

paxdiablo
  • 854,327
  • 234
  • 1,573
  • 1,953
MrGlass
  • 9,094
  • 17
  • 64
  • 89

3 Answers3

68

You can generally do ranges as follows:

\d{4,7}

which means a minimum of 4 and maximum of 7 digits. For your particular case, you can use the one-argument variant, \d{15}.

Both of these forms are supported in Python's regular expressions - look for the text {m,n} at that link.

And keep in mind that \d{15} will match fifteen digits anywhere in the line, including a 400-digit number. If you want to ensure it only has the fifteen, you use something like:

^\d{15}$

which uses the start and end anchors, or

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

which allows arbitrary non-digits on either side.

paxdiablo
  • 854,327
  • 234
  • 1,573
  • 1,953
57

If your regex language is Perl-compatible: \d{15}.

It is difficult to say how handle the edges (so you don't accidentally grab extra digits) without knowing the outer context in which this snippet will be used. The definitive context-independent solution is this:

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

You can put this in the middle of any regex and it will match (and only match) a sequence of exactly 15 digits. It is, however, quite awkward, and usually unnecessary. A simpler version that assumes non-alphanumeric boundaries (e.g., whitespace around the digits) is this:

\b\d{15}\b

But it won't work if the letters immediately precede or followed the sequence.

Wiktor Stribiżew
  • 607,720
  • 39
  • 448
  • 563
Marcelo Cantos
  • 181,030
  • 38
  • 327
  • 365
-4

There, are two ways i have, to limit numbers.

using len,

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

This output will be True / False.

using regular expression,

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

The output will be regular expression object or None.

FeLiX StEpHeN
  • 111
  • 2
  • 8