강의 외부에서 추가로 알게 된 내용
eval() 함수
Python에서 문자열 형태로 작성된 표현식을 실행하여 그 결과를 반환하는 함수다. 즉, 코드나 수식을 문자열로 받아서 실행시켜 결과를 돌려준다. 예를 들어보자.
# 기본적인 사용 예시
expression = "3 + 5 * 2"
result = eval(expression) # 문자열 안의 수식을 계산하여 실행
print(result) # 출력: 13
위 코드에서 eval()은 문자열 "3 + 5 * 2"를 실제 코드처럼 계산해서 결과값인 13을 반환한다.
그러나 eval()은 보안상의 위험이 있을 수 있다. 입력된 문자열이 안전한지 확인하지 않으면 의도치 않은 코드를 실행하여 보안 문제가 발생할 수 있다. 예를 들어, 악의적인 코드가 포함된 문자열을 eval()로 실행하면 시스템에 영향을 줄 수 있다. 따라서 신뢰할 수 없는 사용자 입력에 eval()을 사용하는 것은 피하는 것이 좋다.
정규 표현식 ( Regular Expression, 줄여서 Regex )
정규 표현식은 문자열에서 특정 패턴을 찾거나, 문자열을 변환하고, 데이터를 추출하는 데 사용되는 강력한 도구다. 정규 표현식은 문자들의 특정 순서나 패턴을 지정하여 문자열을 검색, 일치시키거나 변경할 수 있다. 주로 텍스트 분석, 검색, 치환, 유효성 검사 등에 활용된다. 정규 표현식은 복잡한 문자열 검색을 간단하게 만들어주며, 여러 문자열을 한 번에 처리하는 데 매우 유용하다.
정규 표현식의 기본 구성 요소를 살펴보자.
- 일치 문자 (Literal Characters)
- 정규 표현식에서 일치하려는 문자 그대로를 사용할 수 있다.
- 예: abc는 abc라는 문자열을 찾는다.
- 메타문자 (Metacharacters)
- 특별한 의미를 가진 문자로, 정규 표현식의 동작을 제어한다.
- . : 임의의 문자 1개와 일치 (줄 바꿈 제외)
- 예: a.b는 "aab", "acb", "a1b" 등과 일치한다.
- ^ : 문자열의 시작
- 예: ^abc는 "abc"로 시작하는 문자열을 찾는다.
- $ : 문자열의 끝
- 예: abc$는 "abc"로 끝나는 문자열을 찾는다.
- [ ] : 대괄호 안에 있는 문자들과 일치
- 예: [abc]는 "a", "b", 또는 "c"와 일치한다.
- | : OR 연산자
- 예: abc|xyz는 "abc" 또는 "xyz"와 일치한다.
- 수량자 (Quantifiers):
- 패턴이 얼마나 반복될 수 있는지 지정한다.
- * : 0회 이상의 반복
- 예: a*b는 "b", "ab", "aaab" 등과 일치한다.
- + : 1회 이상의 반복
- 예: a+b는 "ab", "aab", "aaab" 등과 일치한다.
- ? : 0회 또는 1회의 반복
- 예: a?b는 "b" 또는 "ab"와 일치한다.
- {n} : 정확히 n회 반복
- 예: a{2}는 "aa"와 일치한다.
- {n,} : n회 이상의 반복
- 예: a{2,}는 "aa", "aaa", "aaaa" 등과 일치한다.
- {n,m} : n회 이상, m회 이하의 반복
- 예: a{2,4}는 "aa", "aaa", "aaaa"와 일치한다.
- 문자 클래스 (Character Classes):
- \d : 숫자 (0-9)
- 예: \d{3}는 3자리 숫자와 일치한다. 즉, \d는 숫자고, {3}회 반복해야 하니까 숫자 3개가 연속으로 나와야 한다. '123', '456', '999'
- \w : 영숫자 (a-z, A-Z, 0-9, _)
- 예: \w+는 하나 이상의 영숫자와 일치한다.
- \s : 공백 문자 (공백, 탭, 줄 바꿈 등)
- 예: \s+는 하나 이상의 공백 문자와 일치한다.
- \D : 숫자가 아닌 문자
- 예: \D+는 숫자가 아닌 문자가 하나 이상인 부분과 일치한다.
- \W : 영숫자가 아닌 문자
- 예: \W+는 영숫자가 아닌 문자가 하나 이상인 부분과 일치한다.
- \d : 숫자 (0-9)
- 그룹화 (Grouping and Capturing):
- ( ) : 소괄호로 묶어서 그룹을 생성할 수 있다. 이 그룹은 나중에 참조할 수 있다.
- 예: (abc)+는 "abc"가 하나 이상 반복되는 부분과 일치한다.
- (?:) : 비캡처 그룹, 일치하긴 하지만 그룹화한 값을 참조할 수 없다.
- 예: (?:abc)+는 "abc"가 하나 이상 반복되는 부분과 일치하지만, 캡처 그룹으로는 저장되지 않습니다.
- ( ) : 소괄호로 묶어서 그룹을 생성할 수 있다. 이 그룹은 나중에 참조할 수 있다.
- 비캡처 그룹이란?
비캡처 그룹 (?:...)
(?:...)는 그룹화는 하되, 그 그룹의 일치한 값을 참조하거나 저장하지 않겠다고 명시하는 것이다. 즉, 일치한 부분은 찾지만 그 결과를 그룹으로 저장하지 않기 때문에 참조할 수 없다. 이 방식은 주로 그룹화가 필요하지만 참조는 하지 않겠다는 의도를 나타낼 때 사용된다.
왜 비캡처 그룹을 사용할까?
- 성능 최적화
비캡처 그룹은 그룹화된 내용을 저장하지 않기 때문에 메모리 사용을 줄이고, 성능을 개선할 수 있다. 만약 그룹화된 값을 참조할 필요가 없다면 비캡처 그룹을 사용하는 것이 더 효율적이다. - 그룹화만 필요할 때
정규 표현식에서 특정 패턴을 묶을 필요가 있지만, 해당 패턴을 따로 저장하거나 참조할 필요는 없을 때 비캡처 그룹을 사용한다. 예를 들어, 여러 개의 선택지를 묶는 경우 등에서 유용하다.
예를 들어보자.
정규 표현식: (?:\d{3})-(\d{4})
- 텍스트: "123-4567"
이 정규 표현식에서는 \d{3}을 비캡처 그룹으로 묶고, \d{4}는 캡처 그룹으로 묶는다. 이 경우, "123"은 추출되지 않으며, "4567"만 추출된다. 비캡처 그룹을 사용한 이유는 123을 추출할 필요가 없기 때문이다.
- 이스케이프 문자 (Escape Characters):
- 일부 문자는 정규 표현식에서 특별한 의미를 가지므로, 이들을 문자 그대로 사용하려면 앞에 역슬래시(\)를 붙여야 한다.
- 예: \.은 마침표 문자 자체를 찾는 정규 표현식이다.
예를 들어보자.
1. 이메일 주소 확인 : 이메일 주소의 기본적인 패턴을 확인하는 정규 표현식
\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,}\b
- \b: 단어 경계를 나타냄
- [A-Za-z0-9._%+-]: 이메일의 사용자 부분에서 허용되는 문자
- @: "@" 문자
- [A-Za-z0-9.-]: 도메인 이름에서 허용되는 문자
- \.: 마침표 문자
- [A-Za-z]{2,}: 2글자 이상의 도메인 확장자
2. 전화번호 확인 (한국 전화번호) : 한국 전화번호 형식에 맞는 정규 표현식
^\d{2,3}-\d{3,4}-\d{4}$
- ^: 문자열의 시작
- \d{2,3}: 2~3자리 숫자 (국번)
- -: 하이픈
- \d{3,4}: 3~4자리 숫자 (중간 번호)
- -: 하이픈
- \d{4}: 4자리 숫자 (끝 번호)
- $: 문자열의 끝
3. URL 추출: URL을 찾는 정규 표현식
https?://[A-Za-z0-9.-]+(?:/[A-Za-z0-9&%_=+./-]*)?
- https?: "http" 또는 "https"와 일치
- ://: "://" 문자열
- [A-Za-z0-9.-]+: 도메인 이름
- (?:/[A-Za-z0-9&%_=+./-]*)?: 선택적 경로 (슬래시로 시작하며 다양한 문자 포함 가능)
다시 내용을 정리해보겠다.
정규 표현식은 특정 문자열을 찾거나 변환하는 데 매우 유용한 도구다. 복잡한 패턴을 정의하여 텍스트를 처리할 수 있기 때문에 데이터 분석, 웹 크롤링, 로그 파일 분석 등에서 자주 사용된다. 정규 표현식은 다소 복잡하지만, 익숙해지면 강력한 텍스트 처리 도구가 된다.
'AI 부트캠프 > 챕터3(11.08~12.04)' 카테고리의 다른 글
TIL 43 도전 과제 (2) | 2024.11.19 |
---|---|
TIL 42 (1) | 2024.11.18 |
TIL 40 (2) | 2024.11.16 |
WIL 6 (0) | 2024.11.15 |
TIL 39 필수 과제 (0) | 2024.11.15 |