Python 에서 한글 조사 을/를, 이/가, 은/는, 와/과 출력하기
예전 게임들을 보면, 조사를 제대로 표현못하는 메시지를 띄우곤 했습니다.
- 당신은 몬스터을(를) 때렸습니다!
와 같이 말이죠. 엄청 구리게 보이죠;
제대로 조사를 쓰려면 한글 조사의 규칙을 좀 연구해야합니다. 결론적으로 말하자면 한글 조사 을/를, 이/가, 은/는, 와/과 등은 그 조사의 앞 글자가 받침이 있느냐 없느냐에 따라 달라집니다.
즉, “사과”라는 단어는 “과”라는 받침이 없는 글자로 끝나기 때문에, 여기에는 “~가” / “~를” / “~는” / “~와” 등의 조사가 붙고, “수박”이라는 단어는 “박”이라는 받침이 있는 글자로 끝나기 때문에 “~이” / “~을” / “~은” / “~과” 등의 조사가 붙는다는 것입니다. 그래서
- 나는 사과를 먹었다
- 나는 수박을 먹었다
와 같이 조사를 사용해야 합니다. 이렇게 제대로 조사를 출력하기 위해서는 조사 앞 글자가 받침이 있느냐 없느냐를 알아내야 합니다.
받침이 있는지 알아내기
파이썬 3.x 에서는 기본적으로 모든 문자열이 유니코드를 쓰기 때문에, 받침 유무를 비교적 수월하게 알 수 있습니다. 유니코드 한글 문자표를 좍 펼쳐놓고 보면 대략 규칙을 발견할 수 있습니다. 결론을 말하자면, 한글문자에 유니코드의 한글 시작점(“가”가 시작점입니다)의 코드를 빼서 28로 나누어 떨어지면 받침이 없고, 나누어 떨어지지 않으면 받침이 있다고 판단하면 됩니다.
def ends_with_jong(kstr):
k = kstr[-1]
if "가" <= k <= "힣":
return (ord(k)-ord("가")) % 28 > 0
else:
return
위 코드에서 만약 파라메터 kstr 의 마지막 글자가 한글이 아니라면 None 을 리턴하게 됩니다.
만약 kstr 이 “사과(apple)” 나 “수박(watermelon)”과 같이 한글과 함께 영문자를 포함하는 경우, 정규표현식(Regular Expression)을 사용하여 다음과 같이 한글부분만 골라내서 처리해도 됩니다.
import re
def ends_with_jong(kstr):
m = re.search("[가-힣]+", kstr)
if m:
k = m.group()[-1]
return (ord(k) - ord("가")) % 28 > 0
else:
return
물론 한글 문자열이 여러개 있는 경우엔 위 코드가 제대로 작동 안 하겠지만, 뭐 그건 그 상황에 맞게 정규표현식을 수정하면 되는 거고, 여기서는 생략합니다.
조사 출력하는 함수
어째건 종성으로 끝나는지 아닌지를 체크하는 코드가 됐으므로 조사를 출력하는 함수는 다음과 같이 만들면 됩니다.
def ul(kstr):
josa = "을" if ends_with_jong(kstr) else "를"
print(f"{kstr}{josa} ", end='')
def yi(kstr):
josa = "이" if ends_with_jong(kstr) else "가"
print(f"{kstr}{josa} ", end='')
def wa(kstr):
josa = "과" if ends_with_jong(kstr) else "와"
print(f"{kstr}{josa} ", end='')
def en(kstr):
josa = "은" if ends_with_jong(kstr) else "는"
print(f"{kstr}{josa} ", end='')
위 코드는 ends_with_jong() 이 None 을 리턴했을 때의 처리는 안 하고 있는데, 뭐 대충 알아서 손 보시기 바라며 그냥 넘어가도록 하겠습니다 ㅎ
if __name__ == "__main__":
apple = "사과"
melon = "수박"
ul(apple); print("집었다.")
ul(melon); print("집었다.")
en(apple); print("맛있다.")
en(melon); print("더 맛있다.")
yi(apple); print("더욱 더 맛있다.")
yi(melon); print("더더욱 맛있다.")
wa(apple); print(melon)
wa(melon); print(apple)
위 함수들을 테스트하는 코드입니다. 그리고 아래는 출력 결과.
사과를 집었다.
수박을 집었다.
사과는 맛있다.
수박은 더 맛있다.
사과가 더욱 더 맛있다.
수박이 더더욱 맛있다.
사과와 수박
수박과 사과
확장
위에서의 논의를 좀 더 확장해서, “~로” / “~으로” 와 같이 방향을 나타내는 조사를 사용할 때, “~야” / “~아” / “~이여” / “~여” 와 같이 누군가를 부를 때 등의 경우도 같은 방식으로 앞 글자가 받침을 갖고있는지에 따라 달리 쓰면 됩니다.
그리고 한가지 주의할 점이 있는데, “~로” / “~으로” 의 경우에는 보통의 경우 “제주도로”, “부산으로” 와 같이 받침이 없는 글자 뒤에는 “~로”가, 받침이 있는 글자 뒤에는 “~으로”가 붙지만, “서울로”와 같이 받침이 있더라도 ㄹ받침 뒤에는 “~로”가 붙으므로 이런 예외를 적절히 처리해야할 것입니다.