Как разделить строку на словарь и отделить слова/предложения от URL-адресов, сохраняя порядок строк

#python #string #dictionary #split

Вопрос:

У меня есть строка с текстом и количеством экземпляров URL в строке. Поскольку myString является переменной, каждый раз не может быть ни одного, одного или нескольких экземпляров URL-адреса в разных частях myString, и я хочу разделить myString на несколько сообщений, только если есть какой-либо URL-адрес. В противном случае это было бы всего одно сообщение.

Я ищу способ отделить текстовые слова/предложения в myString от URL-адресов, но при этом поддерживать порядок, например, в разговоре:

 message1: Text: "Hello world,"
message2: URL: "https://auth.geeksforgeeks.org/user/Chinmoy Lenka/articles"
message3: Text: "in the portal of"
message4: URL: "http://www.geeksforgeeks.org/"
message5: Text: ". Sample text goes here"
... #and so on...
 

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

 myString = "Hello world, https://auth.geeksforgeeks.org/user/Chinmoy Lenka/articles in the portal of http://www.geeksforgeeks.org/. Sample text goes here www.google.com but also here https://google.com lorem ipsum google.com/contact-us multiple urls within text."
 

Комментарии:

1. Это message4: URL: "http://www.geeksforgeeks.org/" недопустимый словарь на python

2. Как вы думаете, почему словарь был бы лучшей структурой данных? Похоже, что список был бы гораздо более подходящим, поскольку он сохраняет порядок элементов, а ключи вашего словаря фактически представляют собой только строку «сообщение» индекс.

3. Что касается вашей проблемы, я бы поискал в Google регулярное выражение для URL-адресов и использовал его для разделения строки на отдельные части URL/не URL.

Ответ №1:

 text = myString.split(" ")
urls = [];

for x in text:
    if x.find("http") != -1:
        urls.append(x)
 

А затем просто распечатайте все остальные записи каждого списка.

Ответ №2:

Вы можете разделить свою строку слово за словом и сохранить в списке. Затем, повторяя этот список, проверьте, является ли текущее слово URL-адресом или нет. Если это так, добавьте его в окончательный список, в противном случае сохраните его temp_words_list . Вот реализация кода:

 def modifier(myString):
    words_list = myString.split()
    final_list = []
    temp_words_list = []

    for word in words_list:
        # assuming every word starting with http is actual url
        if '.com' in word or word.startswith('http'):
            if len(temp_words_list) > 0:
                final_list.append(' '.join(temp_words_list))
                temp_words_list = []
        
            final_list.append(word)
        else:
            temp_words_list.append(word)

    # Handling edge case when string does not end with url
    if len(temp_words_list) > 0:
        final_list.append(' '.join(temp_words_list))

    return final_list

print(modifier(myString))
 

Это даст результат:

 ['Hello world,', 'https://auth.geeksforgeeks.org/user/Chinmoy Lenka/articles', 'in the portal of', 'http://www.geeksforgeeks.org/.', 'Sample text goes here', 'www.google.com', 'but also here', 'https://google.com', 'lorem ipsum', 'google.com/contact-us', 'multiple urls within text.']
 

Ответ №3:

Использование split из re модуля:

 >>> re.split(r's*(https?://[^s]*)s*', myString)

['Hello world,',
 'https://auth.geeksforgeeks.org/user/Chinmoy Lenka/articles',
 'in the portal of',
 'http://www.geeksforgeeks.org/.',  # <- The problem is here (with '.')
 'Sample text goes here www.google.com but also here',
 'https://google.com',
 'lorem ipsum google.com/contact-us multiple urls within text.']