2010-04-13 5 views
3

J'essaie d'utiliser l'expression régulière suivante pour extraire le nom de domaine d'un texte, mais il ne produit rien, quel est le problème? Je ne sais pas si cela est approprié pour poser cette question "fixer le code", peut-être que je devrais en lire plus. Je veux juste gagner du temps. MerciPython expression régulière pour les noms de domaine

pat_url = re.compile(r''' 

      (?:https?://)* 

      (?:[\w]+[\-\w]+[.])* 

      (?P<domain>[\w\-]*[\w.](com|net)([.](cn|jp|us))*[/]*) 

      ''') 

print re.findall(pat_url,"http://www.google.com/abcde") 

Je veux que la sortie soit google.com

Répondre

7

Ne pas utiliser regex pour cela. Utilisez plutôt la bibliothèque standard urlparse. C'est beaucoup plus simple et plus facile à lire/maintenir.

http://docs.python.org/library/urlparse.html

+0

merci Dav, mais le urlparse.netloc renvoie "www.google.com"? Et je veux extraire des URL dans le texte comme ? – yasein

+0

urlparse.scheme + urlparse.netloc + urlparse.path devrait vous donner le résultat attendu. –

+0

Peut-être que tout le monde le sait, mais urlparse.netloc est membre var, pas une fonction. Exemple: 'p = urlparse.urlparse (url); print p.netloc' affiche 'host.example.com' – MarkHu

3

La première est que vous manquez le drapeau re.VERBOSE dans l'appel à re.compile(). La seconde est que vous devriez utiliser les méthodes sur l'objet retourné. La troisième est que vous utilisez une expression régulière où un analyseur approprié existe déjà dans le fichier stdlib.

+0

oh .. la re.VERBOSE fonctionne. Merci – yasein

0

Je ne crois pas que cela concerne réellement la «régression», n'est-ce pas? Il s'agit d'expressions régulières, ce qui est totalement différent. Peut-être que quelqu'un devrait corriger le marquage.

+1

Mais les touches sont comme ... DROITE SUIVANT les uns les autres: P En outre, la boîte de réponse n'est pas l'endroit pour les commentaires sur la question. –

3

Ceci est la seule bonne façon d'analyser une URL avec un regex:

Il est en C++, mais vous trouverez trivial de convertir en python en supprimant plus \. Et avec une énumération pour les captures.

Voir aussi RFC3986 comme source d'origine pour l'expression rationnelle.

static const char* const url_regex[] = { 
    /* RE_URL */ 
    "^(([^:/?#]+):)?(//([^/?#]*)|///)?([^?#]*)(\\?[^#]*)?(#.*)?", 
}; 

enum { 
    URL = 0, 
    SCHEME_CLN = 1, 
    SCHEME = 2, 
    DSLASH_AUTH = 3, 
    AUTHORITY = 4, 
    PATH = 5, 
    QUERY = 6, 
    FRAGMENT = 7 
}; 
0
([a-z0-9][-a-z0-9]*[a-z0-9]|[a-z0-9])\.(COMMUNITY|DIRECTORY|EDUCATION|EQUIPMENT|INSTITUTE|MARKETING|SOLUTIONS|XN--J1AMH|XN--L1ACC|BARGAINS|BOUTIQUE|BUILDERS|CATERING|CLEANING|CLOTHING|COMPUTER|DEMOCRAT|DIAMONDS|GRAPHICS|HOLDINGS|LIGHTING|PARTNERS|PLUMBING|TRAINING|VENTURES|XN--P1AI|ACADEMY|CAREERS|COMPANY|CRUISES|DOMAINS|EXPOSED|FLIGHTS|FLORIST|GALLERY|GUITARS|HOLIDAY|KITCHEN|RECIPES|RENTALS|REVIEWS|SHIKSHA|SINGLES|SUPPORT|SYSTEMS|AGENCY|BERLIN|CAMERA|CENTER|COFFEE|CONDOS|DATING|ESTATE|EVENTS|EXPERT|FUTBOL|KAUFEN|LUXURY|MAISON|MONASH|MUSEUM|NAGOYA|PHOTOS|REPAIR|REPORT|SOCIAL|TATTOO|TIENDA|TRAVEL|VIAJES|VILLAS|VISION|VOTING|VOYAGE|BUILD|CARDS|CHEAP|CODES|DANCE|EMAIL|GLASS|HOUSE|NINJA|PARTS|PHOTO|SHOES|SOLAR|TODAY|TOKYO|TOOLS|WATCH|WORKS|AERO|ARPA|ASIA|BIKE|BLUE|BUZZ|CAMP|CLUB|COOL|COOP|FARM|GIFT|GURU|INFO|JOBS|KIWI|LAND|LIMO|LINK|MENU|MOBI|MODA|NAME|PICS|PINK|POST|QPON|RICH|RUHR|SEXY|TIPS|WANG|WIEN|ZONE|BIZ|CAB|CAT|CEO|COM|EDU|GOV|INT|KIM|MIL|NET|ONL|ORG|PRO|RED|TEL|UNO|WED|XXX|AC|AD|AE|AF|AG|AI|AL|AM|AN|AO|AQ|AR|AS|AT|AU|AW|AX|AZ|BA|BB|BD|BE|BF|BG|BH|BI|BJ|BM|BN|BO|BR|BS|BT|BV|BW|BY|BZ|CA|CC|CD|CF|CG|CH|CI|CK|CL|CM|CN|CO|CR|CU|CV|CW|CX|CY|CZ|DE|DJ|DK|DM|DO|DZ|EC|EE|EG|ER|ES|ET|EU|FI|FJ|FK|FM|FO|FR|GA|GB|GD|GE|GF|GG|GH|GI|GL|GM|GN|GP|GQ|GR|GS|GT|GU|GW|GY|HK|HM|HN|HR|HT|HU|ID|IE|IL|IM|IN|IO|IQ|IR|IS|IT|JE|JM|JO|JP|KE|KG|KH|KI|KM|KN|KP|KR|KW|KY|KZ|LA|LB|LC|LI|LK|LR|LS|LT|LU|LV|LY|MA|MC|MD|ME|MG|MH|MK|ML|MM|MN|MO|MP|MQ|MR|MS|MT|MU|MV|MW|MX|MY|MZ|NA|NC|NE|NF|NG|NI|NL|NO|NP|NR|NU|NZ|OM|PA|PE|PF|PG|PH|PK|PL|PM|PN|PR|PS|PT|PW|PY|QA|RE|RO|RS|RU|RW|SA|SB|SC|SD|SE|SG|SH|SI|SJ|SK|SL|SM|SN|SO|SR|ST|SU|SV|SX|SY|SZ|TC|TD|TF|TG|TH|TJ|TK|TL|TM|TN|TO|TP|TR|TT|TV|TW|TZ|UA|UG|UK|US|UY|UZ|VA|VC|VE|VG|VI|VN|VU|WF|WS|YE|YT|ZA|ZM|ZW)(?![-0-9a-z])(?!\.[a-z0-9]) 

Cette Regex utilise tout ce qu'il sera courant TLDs valide trouvé http://data.iana.org/TLD/tlds-alpha-by-domain.txt prendre une liste de texte et seulement retourner le domain.tld

Par exemple. Nourrir

va revenir

  • google.com
  • hotmail.com
  • yahoo .net

Ce n'est pas idéal, car la regex est assez longue mais elle a fonctionné pour ce dont j'avais besoin à l'époque, j'espère que cela a été utile.

Questions connexes