개요
현재 이직을 위한 준비로 원티드 프리온보딩 코스에서 기업과제를 소화하고 있다.
사실 어제 끝났는데, 게으름 때문에
마지막 기업과제를 수행 중에 있다. 역시 코딩의 꽃은 머리를 써서 로직을 만드는 거다.(아니다.)
여튼 내가 봉착한 문제는 문단을 구분자를 통해 list 로 변환하는 것인데, 이때 두가지 조건이 붙었다.
문제 상황
(1). 유효성 검사
한글, 영어, 숫자, 물음표, 느낌표, 마침표, 따옴표, 공백를 제외한 나머지는 문장에 포함되지 않아야 한다.
(2). split() 하기
'.', '!', '?' 로 문장이 구분됩니다.
그냥 순회로 로직을 짤까 하다가 뭔가 마음에 안들었다.(개인적으로 개발자는 )for
와 if
만 안다면 모든 기능을 구현할 수 있다고 생각하지만 그런 코드 짜면 돌맞는다.
고민을 하다가 그냥 정규표현식을 쓰기로 했다. 하지만 정규표현식이랑 안친해서 pattern 을 어떻게 짜야하는지 문제에 봉착했다. 결국 정규표현식을 구글링 하다가 몇몇 블로그에서 잘 쓰인 걸 참고해서 조합했다.
해결
1. 첫 번째 문제의 해결 방법은 pattern 을 조합하여 치환하는 방법을 사용했다
import re
def get_validate_sentence(sentence: str) -> str:
"""
한글, 영어, 숫자, 물음표, 느낌표, 마침표, 따옴표, 공백를 제외한 나머지는 문장에 포함되지
않도록 문장을 치환함
:param sentence: 문단
:return: 유효성 검사를 체크한 문단을 반환
"""
pattern = r'[^\w.!?\s\'\"]'
return re.sub(pattern, '', sentence)
2. 두 번째 해결방법은 두 단계로 나눴다.
- 첫 번째 pattern 을 통해 list 로 나눈다.
- 이 list 를 순회하면서 뒤에 있는 구분자를 결합하는 방식이다.
import logging
import re
def sentence2texts(sentence: str) -> list:
"""
구분자('?', '.', '!')를 통해 문단을 한 문장씩 끊는 함수 생성
:param sentence: 유효성 검사를 통과한 문단
:return: 한 문장씩 끊은 list 를 반환
"""
sep = ['?', '.', '!']
pattern = f'([{"".join(sep)}])'
li = re.split(pattern, sentence) # 먼저 구분자를 통해 문단을 문장으로 끊음. 이때 구분자는 문장 뒤쪽에 위치하게 됨
result = []
# HACK: 한 문장씩 끊고 뒤에 구분자를 결합하기 위한 로직
for _, x in enumerate(li):
if not x: # 공백 문자 삭제
continue
x = x.strip() # 문장 앞 뒤로 공백 제거
if x in sep:
try:
result.append(result.pop() + x) # 문장 끝에 구분자 ('?', '.', '!') 를 붙여줌
continue
except IndexError as ie:
# 첫 문장이 구분자로 시작할 수도 있으므로 그냥 오류 로그만 내놓고 result 리스트에 포함시키기로 함
logging.warning(f'tts.utils.sentence2texts {ie}\n'
f'sentence start seperator.')
pass
result.append(x)
return result
마무리
사실 별건 아닌데 낯선 정규표현식 을 활용하느라 시간을 꽤 잡아먹었다.
혹시나 코드에서 이상한 점이 있다면(testcase 를 짰으나 구멍이 난 상태일 수도 있으므로) 말씀해주시면 감사합니다.
또한 더 나은 코드나 '이 정도밖에 못짜?' 라고 생각하시면 댓글을 달아주시면 감사합니다. 성장은 언제나 토론을 통해 일어나기 때문에(옛 말에 어린애들은 싸우면서 자란다고 하지않는가?)
참고한 사이트
'Python' 카테고리의 다른 글
WSL2 환경에서 Poetry 사용하기 (0) | 2023.01.16 |
---|---|
[Python] GIL이 뭐죠? (0) | 2022.12.21 |
[Celery] - 시작하기 (0) | 2022.12.08 |
컴파일이란 (0) | 2022.12.07 |
Python 알아보기(1) - 파이썬의 특징 (2) | 2022.12.06 |