Почему findall выводит только группы?
Писал небольшой проект для себя - поиск в тексте ссылок. Для этого использовал регулярные выражения и модуль re с его методом findall.
# поиск
pattern = r'https?://[\S]+(\.\S+)+//?(\S//)*'
text = input('==> ')
finded = re.findall(pattern, text)
print(finded)
Само регулярное выражение довольно простое, да вот незадача - вывод показывает ТОЛЬКО ГРУППУ
Для примера я передам следующее значение:
Вот тестовая ссылка: `https://ru.stackoverflow.com/`
И вывод у меня был такой:
('.com', '')
То есть, программа не выводит полностью совпадения. она предоставляет только группы.
Как можно исправить?
Ответы (1 шт):
Такова специфика 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/']