[Python] 정규 표현식, re.compile(), .findall(), datetime.now(), .strftime("%Y-%m-%d"), .search(), .group()

공부한 내용 정리하는 공간입니다.

틀린 내용이 있을 수 있습니다.

모든 지적, 첨언 환영합니다.

오늘의 코드

1. 정규표현식으로 데이터 추출하기

2. 현재 날짜를 분리하여 출력하기

import re

text = "오늘은 2024년 5월 6일입니다."
pattern = re.compile(r"\d+")
matches = pattern.findall(text)
print(matches)

print("==========")

from datetime import datetime

print(datetime.now())

current_date = datetime.now().strftime("%Y-%m-%d")

date_pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

text = f"Today's date is {current_date}."

match = date_pattern.search(text)
if match:
    print("Full match:", match.group(0))

    year = match.group(1)
    month = match.group(2)
    day = match.group(3)
    
    print("Year:", year)
    print("Month:", month)
    print("Day:", day)
else:
    print("No date found in the text.")

 


정규 표현식

특정한 규칙을 가진 문자열을 찾거나, 대체하거나, 검증할 때 사용하는 문자열 패턴

원하는 규칙에 맞는 부분을 찾기 위한 검색 도구

메타 문자와 축약 표현식을 섞어서 사용

메타문자 의미
. \n을 제외한 모든 문자와 일치
? 0회 또는 1회 등장하는 것과 일치
* 0개 이상 반복되는 것과 일치
+ 1개 이상 반복되는 것과 일치
\ 메타문자를 일반 문자로
| 논리 OR, 둘 중 하나와 일치
^ 문자열의 시작과 일치
$ 문자열의 끝과 일치
{m,n} m회 이상, n회 이하로 반복되는 것과 일치
[ ] 문자 집합, 내부 글자 중 하나와 일치
( ) 내부의 정규식을 그룹으로 처

 

기존 표현식 축약 표현식 의미 일치
[0-9] \d 숫자를 찾음 숫자
[^0-9] \D 숫자가 아닌 것을 찾음 문자, 특수문자, 화이트 스페이스
[\t\n\t\f\v] \s 화이트 스페이스인 것을 찾음 스페이스, 탭, 개행
[^\t\n\r\f\v] \S 화이트 스페이스가 아닌 것을 찾음 문자, 특수문자, 숫자
[a-zA-Z0-9] \w 문자+숫자를 찾음 문자, 숫자
[^a-zA-Z0-9] \W 문자+숫자가 아닌 것을 찾음 특수문자, 공백

 


re.compile()

정규표현식 패턴을 컴파일하여 정규표현식 객체를 반환하는 함수

컴파일된 패턴은 여러 번 사용할 수 있음

정규표현식에서 백슬래시(\)를 그대로 사용하려면 큰따옴표 앞에 r을 붙어야 함

 


.findall()

주어진 문자열에서 정규표현식과 일치하는 모든 부분을 찾아 리스트로 반환하는 함수

일치하는 항목이 하나도 없으면 빈 리스트 반환

re.findall(정규표현식 패턴, 검색할 문자열) 또는 정규표현식 패턴.findall(검색할 문자열) 형태로 사용

 


datetime.now()

현재 시스템의 시간을 가져오는 함수

연도-월-일 시:분:초.마이크로초 형태로 반환

 


.strftime("%Y-%m-%d")

날짜와 시간을 문자열 형식으로 변환하는 함수

연도-월-일을 YYYY-MM-DD 형식으로 변환

 


.search()

주어진 문자열에서 정규표현식 패턴에 첫 번째로 일치하는 부분을 찾아 반환하는 함수

매칭할 부분이 없으면 None 반환

re.search(정규표현식 패턴, 검색할 문자열) 또는 정규표현식 패턴.search(검색할 문자열) 형태로 사용

반환된 객체에서 그룹화된 부분에 접근할 수 있음

 


.group()

정규표현식을 사용하여 매칭된 결과에서 그룹화된 내용을 추출하는 메서드

.group(0) : 매칭된 전체 문자열을 반환

.group(1), .group(2) : 그룹화된 부분을 순차적으로 반환

 


오늘의 코드

1. 정규표현식으로 데이터 추출하기

2. 현재 날짜를 분리하여 출력하기

import re

text = "오늘은 2024년 5월 6일입니다."
pattern = re.compile(r"\d+")
matches = pattern.findall(text)
print(matches)

print("==========")

from datetime import datetime

print(datetime.now())

current_date = datetime.now().strftime("%Y-%m-%d")

date_pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

text = f"Today's date is {current_date}."

match = date_pattern.search(text)
if match:
    print("Full match:", match.group(0))

    year = match.group(1)
    month = match.group(2)
    day = match.group(3)
    
    print("Year:", year)
    print("Month:", month)
    print("Day:", day)
else:
    print("No date found in the text.")

오늘의 코드 결과

오늘의 코드 설명

import re

re모듈 : 정규표현식을 처리하는 기능을 제공하는 표준 라이브러리

1. 정규표현식으로 데이터 추출하기

pattern = re.compile(r"\d+")

r"" : 문자열 내 이스케이프 문자를 있는 그대로 처리

\d : 숫자(0~9)

+ : 앞의 패턴이 1번 이상 반복되는 경우를 찾음

정규표현식을 컴파일(준비)해서 패턴 객체 생성

숫자가 1개 이상 연결된 부분을 찾는 패턴이 pattern에 저장

matches = pattern.findall(text)

text에서 pattern에 일치하는 모든 문자열을 리스트로 반환하여 matches에 저장

matches=['2024', '5', '6']

2. 현재 날짜를 분리하여 출력하기

from datetime import datetime

datetime 모듈의 datetime 클래스를 가져옴

날짜와 시간 관련 작업을 쉽게 처리하기 위한 클래스

print(datetime.now())

현재 날짜와 시간을 출력

current_date = datetime.now().strftime("%Y-%m-%d")

현재 날짜를 YYYY-MM-DD 형식의 문자열로 변환해서 current_date에 저장

date_pattern = re.compile(r'(\d{4})-(\d{2})-(\d{2})')

정규표현식 : (\d{4})-(\d{2})-(\d{2})

그룹화를 통해 매칭된 각 부분(연, 월, 일)을 분리해서 가져올 수 있음

패턴 객체 date_pattern 생성

text = f"Today's date is {current_date}."
match = date_pattern.search(text)

text="Today's date is 2025-01-14"

text에서 date_pattern과 일치하는 첫 번째 부분을 찾아서 match에 저장

정규표현식이 그룹화 되어있기 때문에 match에도 그룹화 되어서 저장

if match:
    print("Full match:", match.group(0))

    year = match.group(1)
    month = match.group(2)
    day = match.group(3)
    
    print("Year:", year)
    print("Month:", month)
    print("Day:", day)

match가 true일 때 실행

text에서 date_pattern과 일치하는 부분이 있으면 match에 값이 저장되어 true

text에서 date_pattern과 일치하는 부분이 없으면 match에 None이 저장되어 false

    >match.group(0)=2024-01-14

    >match.group(1)=첫 번째 그룹=2025

    >match.group(2)=두 번째 그룹=01

    >match.group(3)=세 번째 그룹=14

else:
    print("No date found in the text.")

match가 false일 때 "No date found in the text" 출력