고급 파이썬 개발 과정
챕터
>
레벨
문자열 및 시간 모듈
정규식 모듈
Objective
정규 표현식을 사용하여 직원 및 구역 할당과 관련된 파일을 확인하고 정리합니다.
인접한 사무실에는 새 농지에서 근무를 시작하는 직원들과 작물 및 가축 관리를 위한 구역에 관한 문서를 업데이트해야 할 자료가 있습니다. 파일 관리가 특히 큰 텍스트 덩어리를 다룰 때 까다로울 수 있습니다. 이 목적을 위해 정규 표현식(Regex)으로도 알려진 re 모듈을 사용할 것입니다. 이 모듈의 함수들은 import re를 통해 접근할 수 있으며, 이 단계에서는 다음 함수를 사용할 것입니다:
re.findall(): 문자열에 나타나는 모든 항목의 리스트를 반환합니다. 두 개의 인수를 받으며, 첫 번째는 문자열에서 찾고자 하는 문자, 두 번째는 검색할 문자열입니다.re.sub(): 특정 문자열의 일부를 다른 문자열로 대체합니다. 세 개의 인수를 받으며, 첫 번째는 대체할 문자, 두 번째는 대체할 문자, 세 번째는 검색할 문자열입니다.re.search(): 문자열 내에서 특정 값의 위치를 찾아 객체를 반환합니다. 두 개의 인수를 받으며, 첫 번째는 검색할 문자, 두 번째는 검색할 문자열입니다. 반환된 객체에 대해span()과 같은 다른 함수를 사용하여 검색된 항목의 시작과 끝 위치를 벡터로 얻을 수 있습니다.re.split(): 지정된 구분자에 따라 문자열을 나누어 리스트로 반환합니다. 두 개의 인수를 받으며, 첫 번째는 문자열을 나눌 기준, 두 번째는 나눌 문자열입니다.re.match(): 문자열의 시작 부분에 특정 값이 포함되어 있는지 확인합니다. 이는 단순화된re.search()와 유사하지만, 더 효율적이며 검색 문자열이 시작 부분에 있는지 확인합니다.
re 모듈은 또한 특별한 시퀀스를 사용할 수 있습니다. 이 시퀀스들을 사용하면 여러 가지 문자열 속성을 포함할 수 있습니다. 특별 시퀀스는 매우 많지만, 이 단계에서는 다음을 사용할 것입니다:
\B: 지정한 문자가 단어의 시작이나 끝에 위치하지 않은 경우를 확인합니다.\D: 0-9 사이의 숫자가 아닌 문자를 반환합니다.
특별 시퀀스 앞에 r이 붙어 있으면 원시 문자열을 대상으로 한다는 의미입니다.
먼저 금색 X 표식을 향해 걸어가 메모가 놓인 테이블을 바라보고, read() 함수를 사용하여 모든 직원이 기재된 명부가 포함된 메모를 확인합니다. 각 이름에는 직원 번호를 구분하는 #가 포함되어 있으며, 이름들이 포함된 문자열은 manifest라는 상수에 저장되어 있습니다.
tags라는 리스트를 생성하고 re.findall()의 결과를 저장하여, 다음과 같이 manifest 상수에서 모든 #를 검색합니다: tags = re.findall("#", manifest). tags 리스트의 항목 수를 세기 위해 len() 함수를 사용하여 number라는 변수를 생성합니다. 이를 통해 명부에 몇 명의 직원이 있는지 알 수 있습니다. speak() 함수를 number 변수와 함께 사용하여 리스트에 몇 개의 이름이 있는지 알리세요.
다음으로 파란 카펫 옆의 밝은 X 표식을 향해 걸어가 책상을 바라보고 read() 함수를 사용합니다. 여기에는 새로 채용된 직원들이 할당받은 직위 목록이 있습니다. 각 직업의 이름을 기록하여 현재 배정된 직원들과 교차 확인할 수 있도록 하세요. 이후 파란 카펫 위의 X 표식으로 걸어가 다시 read() 함수를 사용하여 현재 배정된 직무를 확인합니다.
현재 인력은 assignments라는 상수에 저장되어 있으며, 이 문서를 새로 채용된 직원 목록의 정보로 업데이트해야 합니다. re.sub() 함수를 사용하여 문자열 내의 특정 부분을 다른 부분으로 대체하여 목록에 나타난 다른 이름을 갱신합니다. 예를 들어, 다음과 같이 편집합니다:
assignments = re.sub("Billy Hodgins", "Carol Hopkins", assignments)
문서에서 "Billy Hodgins"라는 이름이 "Carol Hopkins"로 대체됩니다. 이 변경 외에도 문서를 스캔하여 목록에 있는 다른 이름 한 개를 추가로 갱신하여 문서를 완전히 업데이트하세요. 업데이트된 결과를 확인하기 위해 assignments와 함께 write() 함수를 사용합니다.
직원 명단의 정리가 완료되었으니, 이제 농장 구역 작업으로 넘어갑니다. 빨간 카펫 위의 어두운 X 표식을 향해 걸어가 read() 함수를 사용하면 구역에 관한 상세 리뷰가 표시됩니다. 이 정보는 zones라는 상수에 저장되어 있습니다.
특히 문서에서 6210의 위치를 식별하는 것이 중요한데, 해당 구역을 재검토해야 하기 때문입니다. 이를 위해 re.search() 함수를 사용하여 zones 내에서 해당 부문 번호의 위치를 찾습니다. index라는 변수를 생성하여 검색 객체를 저장하고, 다음과 같이 r"6210\B"로 검색을 수행합니다: index = re.search(r"6210\B", zones).
이제 index가 검색 객체를 보유하였으므로, span() 함수를 사용하여 데이터를 추출합니다. vector라는 변수를 생성하여 검색 객체의 위치를 저장합니다. 다음과 같이 작성합니다: vector = index.span(). 이후 미리 작성된 write() 함수를 사용하여 이 벡터 값을 출력하세요.
다음 단계로 구역 항목들을 식별하는 작업을 진행합니다. 초록 카펫 위의 어두운 X 표식을 향해 걸어가 sectors라는 리스트를 생성하고 re.split() 함수를 사용하여 다양한 구역 항목들을 리스트로 통합합니다. re.split() 함수에는 특별 시퀀스 "\D"를 사용하여 zones 변수에서 숫자만 추출합니다. 리스트 내포(list comprehension)를 사용하여 len() 함수를 통해 구역 번호로 볼 수 없을 정도로 짧은 항목들을 제거하세요. 예시는 다음과 같습니다:
sectors = re.split("\D", zones) sectors = [x for x in sectors if len(x) > 3]
write() 함수를 사용하여 모든 구역 항목들을 기록하세요.
자주색 카펫 옆의 밝은 X 표식을 향해 걸어가 파일 캐비닛을 바라보고, read() 함수를 사용하여 농지 구역 내 우선 순위 구역을 확인합니다. 이 구역들을 기록해 두어, 해당 구역들이 구역 목록에 포함되어 있는지 확인해야 합니다.
이후 자주색 카펫 위의 어두운 X 표식을 향해 걸어가면, 미리 작성된 코드 에디터 내에 sector_a, sector_b, sector_c라는 세 개의 우선 순위 구역 변수가 준비되어 있습니다. 이 변수들은 sectors 리스트의 모든 항목을 순회하며 re.match() 함수를 통해 필터링하는 리스트 내포를 사용합니다. 미리 작성된 write() 함수에 sector_a, sector_b, sector_c 변수를 삽입하여 단계를 완료하세요.