Регулярные выражения: выделить из строки имя и url
Есть строки:
Пользователь Иван Иванов (https://vk.com/id3213141232)
Чат (идентификатор чата 2000000001, Иван Иванов https://vk.com/id3213141232)
Группа Рога и Копыта (https://vk.com/public5152623623)
из них необходимо получить строки:
name = "Иван Иванов"
url = "https://vk.com/id3213141232"
name = "Идентификатор чата 2000000001, Иван Иванов"
url = "https://vk.com/id3213141232"
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