Разбить ссылку на параметры

Нужна помощь - не могу сообразить: в цикле получаю ссылки по типу:

https://vk.com/wall615115464_55 \n
https://vk.com/photo739520027_457239183?rev=1 \n
https://vk.com/video-209520128_456239021 \n

Нужно ссылку разбить на три параметра type, owner_id и item_id. Где type - это photo, video, а wall нужно заменять на параметр post.

owner_id это первая часть цифр Идентификатор владельца. item_id это вторая часть Идентификатор объекта.

url = 'https://api.vk.com/method/likes.add?type=%s&owner_id=%s&item_id=%s&v=5.131&access_token=%s' % (
                                type, owner_id, item_id, token)

Пробую так:

my_string = "https://vk.com/video-209520128_456239021"
s=my_string.split("/")[3]
l=str.split(s)
m= ([''.join(j) for i,j in groupby (l[0], key=lambda x:x[0].isdigit())])

type = m[0]
owner_id = m[1]
item_id = m[3]

Как теперь прописать условие если typ == wall заменяем на post. При разделении на параметры минус остается у video- а надо так -209520128 может кто поможет, а то шляпа какая то получается.


Ответы (1 шт):

Автор решения: insolor

Регулярное выражение: /([a-z]+)-?(\d+)_(\d+)

  • Вытаскиваемая часть начинается со слеша
  • Дальше идет 1 или более (+) латинская буква ([a-z])
  • Необязательный (?) дефис
  • 1 или более (+) цифр (\d)
  • подчеркивание
  • одна или более цифр

Извлекаемые части берем в скобки, чтобы вытащить только их (а не всю сматченную строку)

Если дефис после video не разделитель, а должен относиться к числу (в чем я сильно сомневаюсь) - включите его во вторую группу: /([a-z]+)(-?\d+)_(\d+)

import re

urls = """
https://vk.com/wall615115464_55
https://vk.com/photo739520027_457239183?rev=1
https://vk.com/video-209520128_456239021
""".strip().splitlines()


for url in urls:
    print(url)
    result = re.search(r"/([a-z]+)-?(\d+)_(\d+)", url)
    print(result.groups())
    type_name, owner_id, item_id = result.groups()

Вывод:

https://vk.com/wall615115464_55
('wall', '615115464', '55')
https://vk.com/photo739520027_457239183?rev=1
('photo', '739520027', '457239183')
https://vk.com/video-209520128_456239021
('video', '209520128', '456239021')

Замену wall на post делаете просто через if, тут не нужно чего-то особенного выдумывать:

if type_name == "wall":
    type_name = "post"
→ Ссылка