2010-12-07 43 views
1

Je me cache depuis quelques semaines, et j'ai décidé de me joindre pour être plus pratique avec mon apprentissage de Python. Ce que j'essaie de faire est de prendre une seule chaîne, contenant plusieurs adresses Web, et d'arriver à une liste contenant toutes les adresses avec un nom de domaine de 2-4 caractères. Les adresses hypothétiques ne sont pas tous les types simples.com, elles peuvent contenir plusieurs périodes. Voici une chaîne exemple que je souhaite convertir:fractionnement d'une chaîne-> liste à vérifier

urlstring = 'albatross.org,boogaloo.boolean.net,zenoparadox.hercules.gr,takeawalkon.the.wildside,fuzzy.logic.it,bronzeandiron.age,areyou.serious' 

Pour obtenir les adresses dans une liste: list(urlstring.split(',')). Mais je ne peux pas déterminer comment discerner la longueur du nom de domaine et le supprimer ou non en fonction de cette longueur. Est-il nécessaire de diviser chaque chaîne d'adresse en sous-chaînes par split('.')? =/

Je suis assez sûr que c'est en quelque sorte répondu ailleurs, mais je ne pouvais pas vraiment trouver quelque chose de similaire. Je m'excuse pour la question super noobish, et promets que mes questions s'amélioreront en qualité pendant que j'apprends.

Répondre

1

En supposant que vous souciez que de la durée du TLD:

[url for url in urlstring.split(',') if 2 <= len(url.split('.')[-2]) <= 4] 
+0

Editer: J'ai trouvé le problème avec votre réponse: len (url.split ('.') [X]), x devrait être -1, pas -2. – Sophia

+0

Au lieu d'utiliser '.split' et en saisissant le dernier élément, vous pouvez utiliser un' .rsplit' limité de sorte que seulement deux éléments soient produits. Ainsi, '[url pour url in urlstring.split (',') si 2 <= len (url.rsplit ('.', 1) [1]) <= 4]'. Cela déclenchera une exception s'il n'y a pas de '.' dans un "url" du tout; le code original acceptera silencieusement 'com' et rejettera silencieusement 'bacon'. –

+0

@Goethe: "foobar.com" .split ('.') [- 2] renvoie "foobar", ce que je pensais que l'OP voulait ... – jtdubs

0

Ou si vous voulez obtenir toutes les urls qui ont au moins un désiré, ou la longueur correcte, nom de domaine, vous pouvez essayer la code suivant:

def len_is_valid(url, min_len, max_len): 
    return any(map(lambda x: min_len<=len(x)<=max_len,url)) 

urlstring = 'albatross.org,boogaloo.boolean.net,zenoparadox.hercules.gr,takeawalkon.the.wildside,fuzzy.logic.it,bronzeandiron.age,areyou.serious' 

url_list = [url for url in urlstring.split(',') 
     if len_is_valid(url.split('.'), 2, 4)] 

print url_list 
# ['albatross.org', 'boogaloo.boolean.net', 'zenoparadox.hercules.gr', 
# 'takeawalkon.the.wildside', 'fuzzy.logic.it', 'bronzeandiron.age'] 
0

Ne pas savoir que l'on serait plus rapide ou la meilleure approche, mais en voici une en utilisant regex:

 
import re 

urls = 'albatross.org,boogaloo.boolean.net,bedei9.paralex.zenoparadox.herc.gr,takeawalkon.the.wildside,fuzzy.logic.it,bronzeandiron.age,areyou.serious,mydom.dom.net,hun.com' 
regex = re.compile('''[[a-zA-Z0-9\-\.]+\.]*[a-zA-Z0-9\-]{2,4}\.[^\.\,]+''') 

url_list = regex.findall(urls) 
print(url_list) 

Note: J'ai utilisé re.compile mais si vous ne l'analysez qu'une seule fois, alors vous n'avez pas à le faire et vous pouvez simplement faire re.findall (patern, urls) et le laisser un seul liner (après l'importation re bien sûr) :

 
url_list = re.findall('''[[a-zA-Z0-9\-\.]+\.]*[a-zA-Z0-9\-]{2,4}\.[^\.\,]+''', urls) 

J'ai aussi modifié la chaîne que vous avez donné pour vous assurer qu'il a traité plusieurs répétitions de abc.abd.abdcde,bdc....

Si certains gourou regex regarde et vous pensez que vous pouvez faire mieux, s'il vous plaît postez le, je voudrais une solution plus rapide/plus précise :).

Aussi je voudrais savoir de la part des gourous python quelle méthode est la plus rapide dans ce cas et laquelle traiterait mieux les plus grandes chaînes.

Dois-je poster une question le demandant? :)