разделение строки-> список для проверки - PullRequest
1 голос
/ 07 декабря 2010

Я прятался в течение нескольких недель и решил присоединиться, чтобы больше узнать о 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('.')?= /

Я почти уверен, что на это как-то ответили в другом месте, но я не мог найти что-то подобное.Я прошу прощения за супер нубский вопрос и обещаю, что мои вопросы будут улучшаться по мере изучения.

Ответы [ 3 ]

1 голос
/ 07 декабря 2010

Если вы заботитесь только о длине ДВУ:

[url for url in urlstring.split(',') if 2 <= len(url.split('.')[-2]) <= 4]
0 голосов
/ 07 декабря 2010

Не знаю, какой из них будет быстрее или лучше, но вот тот, который использует регулярное выражение:

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....

Если какой-то гуру-регекс наблюдает, и вы думаете, что вы можете добиться большего успеха, пожалуйста, опубликуйте его, я хотел бы получить более быстрое / более точное решение:).

Также я хотел бы узнать от гуру питонов, какой метод быстрее в этом случае, а какой лучше обрабатывает большие строки.

Должен ли я опубликовать вопрос, спрашивающий об этом?:)

0 голосов
/ 07 декабря 2010

Или, если вы хотите получить все 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']
...