#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/"
недопустимый словарь на python2. Как вы думаете, почему словарь был бы лучшей структурой данных? Похоже, что список был бы гораздо более подходящим, поскольку он сохраняет порядок элементов, а ключи вашего словаря фактически представляют собой только строку «сообщение» индекс.
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.']