본문 바로가기
코딩 이야기/파이썬(Python)

파이썬(Python) – 초보 탈출 예제 풀이 (2/2)

by 아재코더 2021. 12. 17.
파이썬 - 예제 풀이

정규 표현식 문제를 끝으로 예제풀이를 마감코자 합니다.

 

Q16. 모스 부호 해독입니다.

아래와 같은 모스 신호를 모스부호 규칙표를 참고삼아 해석하는 함수를 작성해 봅니다. 글자와 글자 사이는 공백 1개, 문장과 문장 사이는 공백 2개로 구분합니다.

def Morse(code):

morse_code={'.-':'A','-...':'B','-.-.':'C','-..':'D','.':'E','..-.':'F','--.':'G',

'....':'H','..':'I','.---':'J','-.-':'K','.-..':'L','--':'M','-.':'N',

'---':'O','.--.':'P','--.-':'Q','.-.':'R','...':'S','-':'T','..-':'U',

'...-':'V','.--':'W','-..-':'X','-.--':'Y','--..':'Z'}

return morse_code.get(code)

 

r_code = '.... . ... .-.. . . .--. ... . .- .-. .-.. -.--'

result=[]

for i in r_code.split(" "):

for j in i.split(" "):

result.append(Morse(j))

result.append(' ')

print (''.join(result))

 

실행 결과

HE SLEEPS EARLY

​먼저 모스 부호 규칙표를 딕셔너리 자료형으로 만든 후 모스 신호는 공백 2개 split 하여 반복문 돌리고, 반복문 안에서 공백 1개로 split 하여 다중 반복문 돌리면 쉽게 해결됩니다. 종전과 달리 join 함수 이용하여 출력합니다.

 

Q17. 정규식 a[.]{3, }b와 매치되는 문자열을 알아봅니다.

import re

p=re.compile('a[.]{3, }b')

m1=p.match('acccb')

m2=p.match('a....b')

m3=p.match('aaab')

m4=p.match('a.cccb')

 

print (m1, m2, m3, m4)

실행 결과

None <re.Match object; span=(0, 6), match='a....b'> None None

 

acccb ab 사이 [.]이 3 이상 없어 매치 안 됩니다.

a….b ab 사이 [.]이 3 이상 있어 매치됩니다.

aaab ab 사이 [.]이 3 이상 없어 매치 안 됩니다.

a.cccb ab 사이 [.]이 3 이상 없어 매치 안 됩니다.

​​

Q18. 다음 코드의 결괏값은 무엇일까요? 예상해 봅니다.

import re

p=re.compile('[a-z]+')

m=p.search('5 python')

print(m.start()+m.end())

저는 9를 예상했으나, 10으로 출력됩니다. ㅠㅠ​

결과 확인을 위해 m을 출력해보니 span=(2,8)이 확인됩니다.

a~z까지 최소 한 번 이상 있으면 매치가 되는데 index 번호를 고려하면 2+7이 나와야 하지만, span(2,8)은 2 이상 8미만의 뜻으로 7을 가리킵니다. 그래서 2+8이 되는군요! 사소하지만 또 하나 배워갑니다.

Q19. 전화번호 뒷 4자리를 ####로 바꾸는 프로그램을 정규식을 사용하여 작성해 봅니다.

코드로 풀어내는 것보다 훨씬 간단하지만 쉽지 않습니다. 들여다볼게 많네요!

​​

Q20. 다음은 이메일 주소를 나타내는 정규식입니다. park@naver.com, kim@daum.net, lee@myhome.co.kr 과 매치가 됩니다. 긍정형 전방 탐색 기법을 사용하여 .com 또는 .net아닌 이메일 주소를 제외하는 정규식을 작성해 봅니다.

.*[@].*[.].*$

.*[@].*[.](?=com$)net$).*$ 로 수정하면 되는군요. 도저히 힘들어 결국은 학습서 풀이를 참고하였습니다. ㅠㅠ

​정규식이 제일 어려운 것 같습니다. 고난도 정규식은 봐도 봐도 멍~해지는군요.

댓글