제로베이스 데이터 취업 스쿨 4주차 스터디노트 5호
정규표현식 하면 이전에 웹개발 때 면접봤던 인공지능 회사가 생각난다.
ㅋㅋㅋ 우스운 일이다.
웹개발 공부하다 면접봤던 회사에서 정규표현식으로 코딩테스트를 봤는데
한글자도 적지 못하고 광탈했던 기억이 있다.
그때 당시에도 정규표현식을 공부할 수 있는 방법은 알고있었지만,
너무 하기 싫어서 공부하지 않았다.
현업에서도 정규표현식이 아니면 할 수 없는 일들은 거의 없었던 것 같고,
정 필요할 때에는 완전 주먹구구 식으로 했다.
그 때 사용했던 웹페이지가 이곳이다. RegExr.
완전 유용하다. >>> 링크
정규표현식으로 분리(?)해내야 하는 문장은 다음과 같다.
$10. 2109 W. Chicago Ave., 773-772-0406, theoldoaktap.com
$9.40. 914 Noyes St., Evanston, 847-475-9400, alsdeli.net
$5.49. Multiple locations, ricobenespizza.com
각각의 문장을 1, 2, 3번이라고 하자.
최초로 마주하는 문제는 가격이다. 마침표가 들어가기도 하고, 안 들어가기도 하며,
10일 때에는 10.0. 으로 적어놨으면 편할것을 10으로 적어놨다.
(물론 보기에는 10이 훨씬 좋긴 하지...ㅎ)
그다음은 때때로 쉼표가 2개 있는 주소이다.
2번 문장을 보면 Evanston까지가 주소지이다.
최초에 문장을 .split(',')
으로 했었는데,
2번과 같은 경우로 인해서 전화번호에 쉼표 이후의 주소지가 적히는 이슈가 있었다.
그리고 마지막 문제는, 복수의 주소지가 있는 3번과 같은 가게였다.
그래서 가격과 전화번호를 찾고, 그 사이의 값을 주소로 취급하였으며,
정규표현식에 들어맞지 않아 None을 반환하는 경우에 한정하여,
별도로 가격만 구해주었다.
regex = re.search('\$(\d+\.?\d*)\.(.*)\, ?(\d+\-\d+\-\d+)', target.get_text())
price, phone, address = None, None, None
if regex is None:
price = re.search('\$(\d+\.?\d*)\.', target.get_text()).group(1)
else:
price, phone, address = regex.group(1, 2, 3)
homepage = target.a.get("href") if target.a else None
뭐, 썩 만족스럽진 않다.
실무를 생각해본다면, 이것보다 훨씬 규격화되어 있지 않은 경우도 많을 것이다.
하나의 코드로 모든 경우를 해결하는 것보다는,
쉽게 규격화할 수 있는 데이터에서 값을 뽑아내고,
규격화할 수 없는 데이터는 별도의 데이터베이스에 저장하는 식으로
단계적? 점층적?으로 값을 뽑아내야 하지 않을까 싶다.
일괄적으로 할 수 없다는 사실은
휴먼 에러에 대한 두려움이 생기게 한다.
휴... 쉽지 않다.