2010-07-07 45 views
8

¿Alguien sabe una expresión regular que coincida con Domain.CCTLD? No quiero subdominios, solo el "dominio atómico". Por ejemplo, docs.google.com no coincide, pero google.com sí. Sin embargo, esto se complica con cosas como .co.uk, CCTLD. ¿Alguien sabe alguna solución? Gracias por adelantado.Regex para que coincida con Domain.CCTLD

EDIT: Me he dado cuenta de que también tengo que lidiar con varios subdominios, como john.doe.google.co.uk. Necesita una solución ahora más que nunca: P.

+0

¿Necesita explícitamente una expresión regular, o sería una función para hacerlo basta ? – Benson

+0

Esto se convertiría en una expresión regular bastante grande, ya que necesitaría tratar todos los ccSLD como casos especiales, y hay muchos (y me refiero a MUCHO) de ccSLD. ¡Brasil tiene 66 de ellos! – You

+0

@Benson, una función funcionaría, siempre que pueda encontrar domain.cctld en una larga lista de dominios – Tom

Respuesta

3

Basado en su comentario anterior, voy a reinterpretar la pregunta, en lugar de hacer una expresión regular que coincida con ellos, crearemos una función que los emparejará, y aplicaremos esa función para filtrar una lista de nombres de dominio para incluir solo dominios de primera clase, por ej. google.com, amazon.co.uk.

Primero, necesitaremos una lista de TLD. Como Greg mencionó, la lista de sufijos públicos es un gran lugar para comenzar. Supongamos que ha analizado la lista en una matriz de Python llamada suffixes. Si esto no es algo con lo que se sienta cómodo, comente y pueda agregar algún código que lo haga.

suffixes = parse_suffix_list("suffix_list.txt") 

Ahora vamos a necesitar código que identifica si un determinado nombre de dominio coincide con el patrón algunos-name.suffix:

def is_domain(d): 
    for suffix in suffixes: 
     if d.endswith(suffix): 
      # Get the base domain name without suffix 
      base_name = d[0:-(suffix.length + 1)] 
      # If it contains '.', it's a subdomain. 
      if not base_name.contains('.'): 
       return true 
    # If we get here, no matches were found 
    return false 
+0

¡Gracias! Puedo encontrar mi camino desde aquí. – Tom

+0

¡Ningún problema! Me alegro de poder ayudar. – Benson

+4

Ahora puede usar un paquete de Python simple pero excelente para hacer el trabajo pesado para esto: http://pypi.python.org/pypi/publicsuffix –

-3
^[a-zA-Z0-9\-\.]+\.(com|org|net|mil|edu|COM|ORG|NET|MIL|EDU)$ 
+0

Lea toda la pregunta, esta no es una solución. – You

+0

Como mencioné en mi pregunta, necesito una Expresión regular capaz de encontrar cosas como '.co.uk' o' .edu.hk', no solo los TLD regulares. – Tom

+0

"Tú", golpéame. – Tom

8

Parece que usted está buscando la información disponible a través del proyecto Public Suffix List.

Un "sufijo público" es aquél en el que los usuarios de Internet pueden registrar nombres directamente. Algunos ejemplos de sufijos públicos son ".com", ".co.uk" y "pvt.k12.wy.us". La Lista de sufijos públicos es una lista de todos los sufijos públicos conocidos.

No hay una sola expresión regular que coincida razonablemente con la lista de sufijos públicos. Tendrá que implementar el código para usar la lista de sufijos públicos o buscar una biblioteca existente que ya lo haga.

+0

Lista interesante y probablemente muy útil. – You

+1

Gracias, Greg. Esa es absolutamente la respuesta correcta. Hay bibliotecas para hacer el procesamiento de Lista de sufijos públicos en varios idiomas en http://www.dkim-reputation.org/regdom-libs/ – Anirvan

+0

@Anirvan, ¿conoce un equivalente para Python? La biblioteca que publicó solo está disponible en C, PHP y Perl. – Tom

2

Probablemente resolvería esto obteniendo una lista completa de TLDs y usándola para crear la expresión regular. Por ejemplo (en Ruby, lo siento, no un Pythonista aún):

tld_alternation = ['\.com','\.co\.uk','\.eu','\.org',...].join('|') 
regex = /^[a-z0-9]([a-z0-9\-]*[a-z0-9])?(#{tld_alternation})$/i 

no creo que es posible diferenciar correctamente entre un verdadero dominio de nivel superior en dos partes y un subdominio sin conocer la lista actual de dominios de nivel superior (es decir: siempre podría construir un subdominio que se vea como un TLD si supiera cómo funcionaba la expresión regular.)

Cuestiones relacionadas