Вернуть «Ошибка», если регулярное выражение не найдено - PullRequest
2 голосов
/ 29 мая 2019

У меня есть строка:

link = "http://www.this_is_my_perfect_url.com/blah_blah/blah_blah?=trololo"

И у меня есть функция, которая возвращает доменное имя из этого URL или, если оно не найдено, возвращает '':

def get_domain(url):
    domain_regex = re.compile("\:\/\/(.*?)\/|$")
    return re.findall(domain_regex, str(url))[0].replace('www.', '')

get_domain(link)

возвращенный результат:

this_is_my_perfect_url.com

|$ возвращает '', если регулярное выражение ничего не соответствует.

Есть ли способ реализовать значение по умолчанию Error внутри регулярного выражения, чтобы мне не нужно было выполнять какие-либо проверки внутри функции?

Так что если link = "there_is_no_domain_in_here", то функция возвращается Error вместо ''.

Ответы [ 3 ]

2 голосов
/ 29 мая 2019

Как упомянуто в комментариях выше, вы не можете установить что-либо в регулярном выражении, чтобы сделать это для вас, но вы можете проверить, является ли вывод, возвращаемый re.findall после применения дополнительного форматирования, пустым или нет, и если он пуст,это означает, что совпадений не найдено, верните Error

import re
link = "http://www.this_is_my_perfect_url.com/blah_blah/blah_blah?=trololo"

def get_domain(url):
    domain_regex = re.compile("\:\/\/(.*?)\/|$")

    #Get regex matches into a list after data massaging
    matches = re.findall(domain_regex, str(url))[0].replace('www.', '')

    #Return the match or Error if output is empty
    return matches or 'Error'

print(get_domain(link))
print(get_domain('there_is_no_domain_in_here'))

Вывод будет

this_is_my_perfect_url.com
Error
1 голос
/ 29 мая 2019

Просто положить два моих цента - ленивый квантификатор (.*?) в сочетании с чередованием (|$) очень неэффективен. Вы можете значительно улучшить свое выражение до:

://[^/]+

Кроме того, начиная с Python 3.8 вы можете использовать оператор моржа, как в

if (m := re.search("://[^/]+", your_string)) is not None:
    # found sth.
else
    return "Error"

И нет - с регулярными выражениями в одиночку вы не можете получить что-либо из строки, которой нет во-первых.

0 голосов
/ 29 мая 2019

почему бы не использовать urlparse для получения домена?

# env python 2
# import urlparse
# python 3
from urllib.parse import urlparse


def get_domain(url):
    parsed_uri = urlparse(url)
    domain = parsed_uri.netloc
    return (domain, "ERROR")[domain is '']

url = 'there_is_no_domain_in_here'
print(get_domain(url))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...