Разбить ссылку на параметры
Нужна помощь - не могу сообразить: в цикле получаю ссылки по типу:
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 шт):
Регулярное выражение: /([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"