Почему findall выводит только группы?

Писал небольшой проект для себя - поиск в тексте ссылок. Для этого использовал регулярные выражения и модуль re с его методом findall.

# поиск
pattern = r'https?://[\S]+(\.\S+)+//?(\S//)*'
text = input('==> ')
finded = re.findall(pattern, text)
print(finded)

Само регулярное выражение довольно простое, да вот незадача - вывод показывает ТОЛЬКО ГРУППУ

Для примера я передам следующее значение:

Вот тестовая ссылка: `https://ru.stackoverflow.com/`

И вывод у меня был такой:

('.com', '')

То есть, программа не выводит полностью совпадения. она предоставляет только группы.

Как можно исправить?


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

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

Такова специфика re.findall:

re.findall(pattern, string, flags=0)

Return all non-overlapping matches of pattern in string, as a list of strings. The string is scanned left-to-right, and matches are returned in the order found. If one or more groups are present in the pattern, return a list of groups; this will be a list of tuples if the pattern has more than one group. Empty matches are included in the result.

В качестве решения можно использовать незахватывающие группы (non-capturing groups):

pattern = r'https?://[\S]+(?:\.\S+)+//?(?:\S//)*'
# NOTE: -----------------> ^^  -------> ^^

или же сделать одну группу:

pattern = r'(https?://[\S]+(?:\.\S+)+//?(?:\S//)*)'
# NOTE: --> ^ ----------------------------------> ^

результат в обоих случаях:

In [143]: re.findall(pattern, text)
Out[143]: ['https://ru.stackoverflow.com/']
→ Ссылка