Регулярные выражения: выделить из строки имя и url

Есть строки:

  1. Пользователь Иван Иванов (https://vk.com/id3213141232)

  2. Чат (идентификатор чата 2000000001, Иван Иванов https://vk.com/id3213141232)

  3. Группа Рога и Копыта (https://vk.com/public5152623623)

из них необходимо получить строки:

  1. name = "Иван Иванов" url = "https://vk.com/id3213141232"
  2. name = "Идентификатор чата 2000000001, Иван Иванов" url = "https://vk.com/id3213141232"
  3. name = "Рога и Копыта" url = "https://vk.com/public5152623623"

Подскажите, пожалуйста, регулярные выражения для получения данных строк.


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

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

Собственно, ничего сложного: открываем любой онлайн редактор регулярных выражений (я пользуюсь этим), смотрим на подсказки внизу и пробуем до тех пор пока не получится. У меня получилось так:

^[А-я]+\s+(?([^(]?)\s(?(https?://[^)])

А вставить его в код можно кучей разных способов, вот, например, мой вариант:

import re
from typing import Optional
from dataclasses import dataclass
    
    
@dataclass()
class Chat:
    name: Optional[str] = None
    url: Optional[str] = None
    
    def __post_init__(self):
        matches = re.search("^[А-я]+\s+\(?([^(]*?)\s\(?(https?://[^)]*)", line)
        if matches:
            self.name, self.url = matches.groups()
        else:
            self.name = None
    
    
strings_list = [
    "Пользователь Иван Иванов (https://vk.com/id3213141232)",
    "Чат  (идентификатор чата 2000000001, Иван Иванов https://vk.com/id3213141232)",
    "Группа Рога и Копыта (https://vk.com/public5152623623)",
    "Any text..."
    ]
    
for line in strings_list:
    chat = Chat(line)
    print(chat)
    print(chat.name)
    print(chat.url)
    print()

Вывод:

Chat(name='Иван Иванов', url='https://vk.com/id3213141232')
Иван Иванов
https://vk.com/id3213141232
    
Chat(name='идентификатор чата 2000000001, Иван Иванов', url='https://vk.com/id3213141232')
идентификатор чата 2000000001, Иван Иванов
https://vk.com/id3213141232
    
Chat(name='Рога и Копыта', url='https://vk.com/public5152623623')
Рога и Копыта
https://vk.com/public5152623623
    
Chat(name=None, url=None)
None
None
→ Ссылка