【问题标题】:splitting a string->list to be checked拆分要检查的字符串->列表
【发布时间】:2010-12-07 03:00:10
【问题描述】:

我已经潜伏了几个星期,并决定加入,以便更多地动手学习 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('.') 拆分成子字符串? =/

我很确定这在其他地方以某种方式得到了回答,但我真的找不到完全相同的东西。我为这个超级白痴的问题道歉,并保证我的问题会随着我的学习而提高质量。

【问题讨论】:

    标签: python string split


    【解决方案1】:

    假设您只关心 TLD 的长度:

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

    【讨论】:

    • 编辑:我发现你的回答有问题:len(url.split('.')[x]), x 应该是-1,而不是-2。
    • 可以使用有限的.rsplit,而不是使用.split 并抓取最后一个项目,以便只生成两个项目。因此,[url for url in urlstring.split(',') if 2 &lt;= len(url.rsplit('.', 1)[1]) &lt;= 4]。如果没有'.',这将引发异常。完全在“url”中;原始代码会默默地接受“com”并默默地拒绝“bacon”。
    • @Goethe: "foobar.com".split('.')[-2] 返回“foobar”,这是我认为 OP 想要的......
    • @karl-knechtel:关于 rsplit 的观点很好。目前尚不清楚该 OP 是否要将子域计为长度的一部分。我假设他只想要 TLD。
    • 我只是想检查 TLD,但是以 -2 作为切片中的索引,它只返回 TLD 最长的地址
    【解决方案2】:

    或者,如果您想获取至少有一个所需的或长度正确的域名的所有 url,您可以尝试以下代码:

    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']
    

    【讨论】:

      【解决方案3】:

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

      重新进口 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' 正则表达式 = re.compile('''[[a-zA-Z0-9\-\.]+\.]*[a-zA-Z0-9\-]{2,4}\.[^\. \,]+''') url_list = 正则表达式.findall(urls) 打印(url_list)

      注意:我使用了 re.compile 但如果您只解析一次,那么您不必这样做,您可以简单地执行 re.findall(pattern, urls) 并将其保留为一个衬里(当然是在 import re 之后):

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

      我还修改了您提供的字符串,以确保它可以处理多次重复的abc.abd.abdcde,bdc...

      如果某个正则表达式大师正在观看并且您认为自己可以做得更好,请发布它,我希望有一个更快/更准确的解决方案:)。

      我还想从 python 专家那里知道在这种情况下哪种方法更快,哪种方法可以更好地处理更大的字符串。

      我应该发布一个问题来问这个问题吗? :)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-03-25
        • 2020-04-14
        • 1970-01-01
        • 2019-04-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多