Wydajny wyrażeń regularnych Django QuerySet

Mam taki model:

class CampaignPermittedURL(models.Model):
    hostname = models.CharField(max_length=255)
    path = models.CharField(max_length=255,blank=True)

Często otrzymuję adres URL, który mogę przekształcić w nazwę hosta i ścieżkę. Chciałbym, aby użytkownik końcowy mógł wprowadzić nazwę hosta (yahoo.com) i ewentualnie ścieżkę (śluby).

Chciałbym znaleźć, gdy URL nie pasuje do takiej kombinacji nazwy hosta / ścieżki:

sukces: www.yahoo.com/weddings/newyorksukces: yahoo.com/weddingsbrak: cnn.comporażka: cnn.com/weddings

Myślę, że najlepszym sposobem na to jest:

url = urlsplit("http://www.yahoo.com/weddings/newyork")
### split hostname on . and path on /
matches = CampaignPermittedURL.objects.filter(hostname__regex=r'(com|yahoo.com|www.yahoo.com)'), \
    path__regex=r'(weddings|weddings/newyork)')

Czy ktoś ma lepsze pomysły? ja używamPostgreSQL i inaczej chciałbym spróbowaćWyszukiwanie pełnotekstowe Django ale nie jestem pewien, czy to się opłaca, czy też lepiej pasuje do moich potrzeb. Czy są inne metody, które są równie szybkie?

Pamiętaj, że moja metoda ma przekazany adres URL i że obiekt CampaignPermittedURL może mieć wiele setek rekordów. Szukam przede wszystkim rozwiązań rozszerzalnych / serwisowalnych, ale musi być również wydajne, ponieważ będzie skalowane do kilkuset wywołań na sekundę.

Nie mam nic przeciwko używaniu innego zaplecza (Sfinks?), ale najbardziej zależy mi na utrzymaniu standardowego Django w najwyższym możliwym stopniu.

questionAnswers(2)

QuestionSolution

jak określono w pytaniu. Powinno to być dość szybkie, nie wychodząc z Django:

        # >>> url.hostname.split(".")
    # ["bakery", "yahoo", "com"]
    host_list = url.hostname.split(".")

    # Build regex like r"^$|^[.]?com$|^[.]?yahoo\.com$|^[.]?baking[.]yahoo[.]com$"
    # Remember that
    # >>> r'\'
    # '\\'
    host_list.reverse()

    # append_str2 might not be necessary
    append_str = r""
    append_str2 = r""
    host_regex = r"^$"
    for host in host_list:
        append_str = r"[.]" + host + append_str
        append_str2 = append_str[3:]
        host_regex = host_regex + r"|^[.]?" + append_str2 + r"$"
    # If nothing is in the filter at all, bypass the filter.
    if CampaignRequiredURL.objects.filter():
        if not CampaignRequiredURL.objects.filter(hostname__iregex=host_regex):
            #Do something based on a hit.
 hobs09 sty 2013, 18:53
Ładne użycie django__iregex, ponieważ część domeny adresów URL nie uwzględnia wielkości liter i jest to jedyna część sprawdzana w wyrażeniu regularnym. Twoje wyrażenie regularne będzie pasowało do YAHOO.COM, tak jak powinno. @ maček's będzie tęsknić za tym.

Regex:^(http\:\/\/)?(www\.)?yahoo\.com(\/.+)?$

http://www.yahoo.com/weddings/newyork pass
www.yahoo.com/weddings/foo            pass
www.yahoo.com/weddings                pass
www.yahoo.com                         pass

yahoo.com/weddings/foo                pass
yahoo.com/weddings                    pass
yahoo.com                             pass

cnn.com/weddings/foo                  fail
cnn.com/weddings                      fail
cnn.com                               fail
 Adam Nelson07 paź 2009, 22:34
To zasadniczo upraszcza moją odpowiedź do tej - jak dotąd najlepszej odpowiedzi: (hostname__regex = r '(www.)? (Yahoo.)? (Com)? $18$#39;), ___Regex = r '^ (wesela /)?(Nowy Jork)?')

yourAnswerToTheQuestion