Nikhil Rupanawar
Nikhil Rupanawar

Reputation: 4191

Valid domain name regex

how should be valid domain name regex which full fill following criteria.

  1. each label max 63 characters long minimum 1 characters
  2. contains numbers, letters and '-', But
  3. should not start and end with '-'
  4. max domain name length 255 characters minimum 1.

for example

some of valid combinations:

a
a.com
aa-bb.b

I created this ^(([a-z0-9]){1,63}\.?){1,255}$

But currently its not validating '-' part as required (it's , missing)

Is there any way?

plz correct me if I am wrong.

Upvotes: 2

Views: 26179

Answers (8)

juankysmith
juankysmith

Reputation: 12448

Try this:

^(([a-z0-9]\-*[a-z0-9]*){1,63}\.?){1,255}$

Upvotes: -1

toto_tico
toto_tico

Reputation: 19027

You can use a library, e.g. validators. Or you can copy their code:

Installation

pip install validators

Usage

import validators
if validators.domain('example.com')
    print('this domain is valid')

In the unlikely case you find a mistake, you can fix and report the error.

Upvotes: 2

Dropout
Dropout

Reputation: 13866

Instead of using regex try to look at urlparse

https://docs.python.org/3/library/urllib.parse.html

It's fairly simple to learn and a lot better and comfortable to use.

Upvotes: 0

Steve Goossens
Steve Goossens

Reputation: 1028

This expression should meet all the requirements: ^(?=.{1,255}$)(?!-)[A-Za-z0-9\-]{1,63}(\.[A-Za-z0-9\-]{1,63})*\.?(?<!-)$

  • uses lookahead for total character length
  • domain can optionally end with a .

Upvotes: 2

Nikhil Rupanawar
Nikhil Rupanawar

Reputation: 4191

and mandatory to end with '.' : Here i found the solution

"^(((([A-Za-z0-9]+){1,63}\.)|(([A-Za-z0-9]+(\-)+[A-Za-z0-9]+){1,63}\.))+){1,255}$"

Upvotes: 3

piokuc
piokuc

Reputation: 26184

Don't use regex for parsing domain names, use urllib.parse.

If you need to find valid domain names in HTML then split the text of the page with a regex [ <>] and then parse each resulting string with urllib.parse.

Upvotes: 0

adam
adam

Reputation: 238

Maybe this:

^(([a-zA-Z0-9\-]{1,63}\.?)+(\-[a-zA-Z0-9]+)){1,255}$

Upvotes: 1

user2878309
user2878309

Reputation: 131

Use the | operator in your RE followed by the '-'.. ensure you escape the literal '-' with \

Upvotes: 0

Related Questions