2010-12-07 55 views
1

我已经潜伏了几个星期,并决定加入,以便更好地学习Python。分割一个字符串 - >要检查的列表

我想要做的是采取一个单一的字符串,包含几个网址,并拿出一个列表包含所有的地址与2-4个字符的域名。假设地址并非全部是simple.com类型,它们可能包含多个句点。下面是我想转换的样本串:

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

要在列表中获得地址:list(urlstring.split(','))。但我无法确定如何辨别域名的长度并根据该长度删除或不删除域名。是否有必要将每个地址字符串拆分为子字符串split('.')? =/

我敢肯定,这是以某种方式在其他地方回答,但我无法真正找到完全相似的东西。我为这个超级noobish问题表示歉意,并承诺我的问题会在我学习时提高质量。

回答

1

假设你只关心TLD的长度:

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

编辑:我发现你的答案的问题:len(url.split('。')[x]),x应该是-1,而不是-2。 – Sophia 2010-12-07 03:14:32

0

或者,如果你想获得所有具有至少一个期望,或长度是正确的,域名的网址,你可以尝试下面的代码:

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

不知道哪一个会更快,更好的方法,但这里是一个使用正则表达式:

 
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) 

注:我使用re.compile,但如果你只解析它一次,那么你不必,你可以简单地做re.findall(patern,urls),并留下一个班轮(当然导入后) :

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

我还修改了字符串你给以确保它处理的abc.abd.abdcde,bdc...,重复数次。

如果有一些正则表达式的专家正在观察,并且您认为您可以做得更好,请发布它,我会喜欢更快/更准确的解决方案:)。

另外我想知道从蟒蛇大师哪种方法在这种情况下更快,哪一个会更好地处理更大的字符串。

我应该发表一个问题吗? :)