파이썬 - 정규식을 이용한 특정 문자열 선별

  • 이번에는 사용자가 숙소 업체 플랫폼 사이트에서 특정 검색키워드, 숙박할 인원 조건에 해당하는 숙소를 검색할 때 정규식을 사용하여 조건에 해당되는 숙소를 찾는 방법에 대해 알아볼 것이다.

사용자가 조건 설정하여 원하는 숙소 조회 시, 정규식을 사용하여 검색어에 해당되는 숙소 목록 제공하기

ex) yanolja_project

1. 모델 작성

  • 경로 : yanolja_project > stay(앱) > models.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    from django.db import models
    from taggit.managers import TaggableManager

    class Category(models.Model):
    staying = models.CharField(max_length=50) # 모텔, 호텔/리조트, 펜션/풀빌라, 게스트하우스

    def __str__(self):
    return self.staying

    class Stay(models.Model):
    # 모텔, 호텔,리조트, 펜션/풀빌라, 게스트하우스 선택
    category = models.ForeignKey(Category, on_delete=models.SET, null=True, blank=True, related_name="stays")

    # 숙소 이름(ex. 역삼 바레)
    name = models.CharField(max_length=50)

    # 유저 아이디(ex. positipman)
    username = models.ForeignKey(get_user_model(), on_delete=models.CASCADE, related_name="stays")

    # 숙소 위치(ex. 서울특별시 강남구 봉은사로 428)
    location = models.CharField(max_length=100)

    # 검색 관련 키워드
    keywords = TaggableManager()

    ...

2. 변경사항 저장 및 migrate 진행

  • 경로 : yanolja_project
    1
    2
    $ python manage.py makemigrations
    $ python manage.py migrate

3. 뷰 페이지 작성 (검색 키워드 필터링)

  • 경로 : yanolja_project > stay > views.py
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    def stay_list(request):
    if request.method == "POST":
    # 프론트단으로부터 (모텔, 호텔/리조트, 펜션/풀빌라, 게스트하우스 중 1 택) 정보를 category라는 문자열 형태의 변수로 받는다.
    category_str = request.POST.get('category', None)
    category_obj = Category.objects.get(staying=category_str)
    # 특정 category에 해당하는 숙소 필터링
    stays = Stay.objects.filter(category=category_obj)

    # <--메인페이지 검색페이지에서 사용자가 키워드 입력한 경우 해당 숙소 필터링하는 코드-->
    # 프론트단으로부터 검색 키워드를 'searchKeyword'라는 문자열 형태의 변수로 받는다.
    # ex) "강남/역삼/선릉/삼성", "서울 송파구 올림픽대로", "역삼 마레", "역삼" ...
    search_keyword = request.POST.get('searchKeyword', None)
    # 사용자가 입력한 키워드에 해당하는 숙소 객체 선별
    if search_keyword is not None:
    # 검색 키워드에서 한글, 정수, 영문 키워드만 필터링하여 리스트로 변환
    # ex. "강남,역삼/삼성, 테헤란로2길 artist" --> ['강남','역삼','삼성','테헤란로2길, 'artist']
    not_hangul = re.compile('[^가-힣\da-z]+')
    result_str = not_hangul.sub(' ', search_keyword)
    result_list = result_str.split(' ')

    # Stay 모델의 name에 검색 키워드가 있는 숙소 필터링
    # ex. result_list = ['강남, '역삼', '삼성', '테헤란로2길', 'artist']
    que_name = Q(name__icontains=result_list[0])
    for keyword in result_list[1:]:
    que_name |= Q(name__icontains=keyword)

    # Stay 모델의 location에 검색 키워드가 있는 숙소 필터링
    que_location = Q(location__icontains=result_list[0])
    for keyword in result_list[1:]:
    que_location |= Q(location__icontains=keyword)

    # Stay 모델의 name 또는 location 또는 keywords 필드에 검색 키워드가 있는 숙소 필터링(숙소 객체 중복 불가)
    stays = stays.filter(Q(keywords__name__in=result_list)|que_name|que_location).distinct()

    # 검색 키워드에 해당하는 숙소가 없을 경우
    if not stays.exists():
    return JsonResponse({'searchResult':False})

    # <--메인페이지 검색페이지에서 사용자가 총 인원수(성인+아동) 설정한 경우 해당 숙소 필터링하는 코드-->
    # 프론트단으로부터 총 인원 수를 'personnel'이라는 변수(int type)로 받는다.
    personnel = request.POST.get('personnel', None)
    # 사용자가 설정한 인원수를 수용할 수 있는 숙소 객체 선별
    stays = stays.filter(rooms__maximumPersonnel__gte=personnel).distinct()

    return render(request, 'stay/stay_list.html', {'objects': stays})

    # request method가 POST 아닌 경우
    else:
    stays = Stay.objects.all()

    return render(request, 'stay/stay_list.html', {'objects':stays})