Python 의 정규 표현 식 상세 설명

기초 편
정규 표현 식 은 python 에서 매우 많이 사 용 됩 니 다.그 는 임의의 매 칭 을 할 수 있 기 때문에 우리 가 추출 하고 자 하 는 정보 와 일치 할 수 있 습 니 다.우리 가 정규 와 접촉 할 때 너 는 정규 의 강 함 을 알 게 될 것 이다.정규 라 이브 러 리 는 일부 프로젝트 에서 정규 라 이브 러 리 를 자주 호출 하여 일치 하 는 문 제 를 만 듭 니 다.
문자열 은 프로 그래 밍 할 때 가장 많이 언급 된 데이터 구조 로 문자열 을 조작 하 는 데 필요 한 곳 이 거의 없다.예 를 들 어 하나의 문자열 이 합 법 적 인 Email 주소 인지 판단 할 수 있 습 니 다.@전후의 하위 문자열 을 추출 하고 단어 와 도 메 인 이름 인지 판단 할 수 있 지만 이렇게 하 는 것 은 번 거 로 울 뿐만 아니 라 코드 를 재 활용 하기 어렵 습 니 다.
정규 표현 식 은 문자열 과 일치 하 는 강력 한 무기 입 니 다.그것 의 디자인 사상 은 묘사 적 인 언어 로 문자열 에 규칙 을 정의 하 는 것 이다.규칙 에 부합 되 는 문자열 이 라면 우 리 는 그것 이 일치 하 다 고 생각한다.그렇지 않 으 면 이 문자열 은 비합법적 이다.
그래서 우 리 는 문자열 이 합 법 적 인 Email 인지 아 닌 지 를 판단 하 는 방법 은:
1.Email 과 일치 하 는 정규 표현 식 만 들 기;
2.이 정규 표현 식 으로 사용자 의 입력 과 일치 하 는 지 여 부 를 판단 합 니 다.
정규 표현 식 도 문자열 로 표시 되 기 때문에 문자 로 문 자 를 설명 하 는 방법 을 먼저 알 아야 합 니 다.
정규 표현 식 에서 문 자 를 직접 주면 정확하게 일치 합 니 다.\d 로 숫자 를 일치 시 킬 수 있 습 니 다.\w 는 알파벳 이나 숫자 를 일치 시 킬 수 있 기 때문에:
'00\d' '007'과 일치 할 수 있 지만'00A'와 일치 할 수 없습니다.
'\d\d\d' '010'과 일치 할 수 있 습 니 다.
'\w\w\d' 'py3'와 일치 할 수 있 습 니 다.. 임의의 문자 와 일치 할 수 있 기 때문에:
'py.''pya','pyb','py!'와 일치 할 수 있 습 니 다.잠깐 만. 
길 어 지 는 문자 와 일치 하려 면 정규 표현 식 에서*로 임의의 문자(0 개 포함)를 표시 하고+로 최소한 한 문 자 를 표시 합 니 다.사용 하 시 겠 습 니까?0 개 또는 1 개 문 자 를 표시 하고{n}으로 n 개 문 자 를 표시 하 며{n,m}으로 n-m 문 자 를 표시 합 니 다.
복잡 한 예 를 보십시오.\\d{3}\s+\d{3,8}.
왼쪽 에서 오른쪽으로 읽 어 보 겠 습 니 다.
1. \d{3}는 3 개의 숫자 와 일치 하 는 것 을 나타 낸다.예 를 들 어'010'이다.
2.\s빈 칸(Tab 등 공백 문자 포함)과 일치 할 수 있 기 때문에\s+는 최소한 하나의 빈 칸 이 있 음 을 나타 낸다.예 를 들 어 일치 하 는','등 이다.
3.\d{3,8}는 3-8 개의 숫자 를 나타 내 는데 예 를 들 어'1234567'이다.
종합 하면 위의 정규 표현 식 은 임의의 빈 칸 으로 구 분 된 지역 번호 가 있 는 전화번호 와 일치 할 수 있 습 니 다.
'010-12345'같은 번 호 를 맞 추 려 면?'-'는 특수 문자 이기 때문에 정규 표현 식 에 서 는'\'로 의 미 를 바 꿔 야 합 니 다.따라서 위의 정 규 는\d{3}\-\d{3,8}입 니 다.
그러나 빈 칸 이 있 기 때문에'010-12345'와 일치 하지 않 습 니 다.그래서 우 리 는 더욱 복잡 한 일치 방식 이 필요 하 다.
강화 편
더욱 정확하게 일치 하려 면[]로 범 위 를 표시 할 수 있다.예 를 들 어:
[0-9a-zA-Z\_] 숫자,알파벳 또는 밑줄 을 일치 시 킬 수 있 습 니 다.
[0-9a-zA-Z\_]+최소한 하나의 숫자,자모 또는 밑줄 로 구 성 된 문자열 과 일치 할 수 있 습 니 다.예 를 들 어'a100','0 'Z','Py 3000'등등;
[a-zA-Z\_][0-9a-zA-Z\_]* 알파벳 이나 밑줄 로 시작 한 다음 에 숫자,알파벳 또는 밑줄 로 구 성 된 문자열,즉 Python 의 합 법 적 인 변 수 를 연결 할 수 있 습 니 다.
[a-zA-Z\_][0-9a-zA-Z\_]{0, 19} 변수의 길 이 를 1-20 글자(앞의 1 글자+뒤의 최대 19 글자)로 더욱 정확하게 제한 했다.A|BA 나 B 와 일치 할 수 있 기 때문에(P|p)ython 은'Python'이나'python'과 일치 할 수 있 습 니 다.^줄 의 시작 을 나타 내 고 ^\d 숫자 로 시작 해 야 한 다 는 뜻 이다.$줄 의 끝 을 나타 내 고\d$ 숫자 로 끝내 야 한 다 는 뜻 이다.
py 도'python'과 일치 할 수 있 지만^py$를 더 하면 줄 전체 가 일치 하 게 되 어'py'와 일치 할 수 밖 에 없습니다.
re 모듈
준비 지식 이 있 으 면 우 리 는 Python 에서 정규 표현 식 을 사용 할 수 있 습 니 다.Python 은 모든 정규 표현 식 기능 을 포함 하 는 re 모듈 을 제공 합 니 다.Python 의 문자열 자체 도\\전 의 를 사용 하기 때문에 특히 주의해 야 합 니 다.

s = 'ABC\\-001' # Python    
#              :
# 'ABC\-001'
따라서 우 리 는 Python 의 r 접 두 사 를 사용 할 것 을 강력 히 건의 합 니 다.전의 문 제 를 고려 하지 않 아 도 됩 니 다.

s = r'ABC\-001' # Python    
#              :
# 'ABC\-001'
정규 표현 식 이 일치 하 는 지 먼저 확인 하 십시오.

>>> import re
>>> re.match(r'^\d{3}\-\d{3,8}$', '010-12345')
<_sre.SRE_Match object at 0x1026e18b8>
>>> re.match(r'^\d{3}\-\d{3,8}$', '010 12345')
>>>
match()방법 은 일치 하 는 지 여 부 를 판단 합 니 다.일치 하 는 데 성공 하면 Match 대상 을 되 돌려 줍 니 다.그렇지 않 으 면 None 으로 돌아 갑 니 다.흔히 볼 수 있 는 판단 방법 은:

test = '        '
if re.match(r'     ', test):
  print 'ok'
else:
  print 'failed'
분할 문자열
정규 표현 식 으로 문자열 을 자 르 는 것 이 고정된 문자 로 자 르 는 것 보다 더 유연 합 니 다.정상 적 인 절 분 코드 를 보십시오.

>>> 'a b  c'.split(' ')
['a', 'b', '', '', 'c']
음,연속 적 인 빈 칸 을 식별 할 수 없습니다.정규 표현 식 으로 시도 해 보 세 요.

>>> re.split(r'\s+', 'a b  c')
['a', 'b', 'c']
몇 개의 빈 칸 을 막론하고 정상적으로 분할 할 수 있다.가입,시도:

>>> re.split(r'[\s\,]+', 'a,b, c d')
['a', 'b', 'c', 'd']
재가 입;시험 해 보기:

>>> re.split(r'[\s\,\;]+', 'a,b;; c d')
['a', 'b', 'c', 'd']
사용자 가 탭 을 입력 했다 면 다음 에는 정규 표현 식 으로 불 규범 한 입력 을 올 바른 배열 로 바 꾸 는 것 을 기억 하 세 요.
패 킷
일치 하 는 지 여 부 를 간단하게 판단 하 는 것 외 에 정규 표현 식 은 하위 문자열 을 추출 하 는 강력 한 기능 도 있다.()로 추출 할 그룹(Group)을 표시 합 니 다.예 를 들 면:^(\d{3})-(\d{3,8})$두 그룹 을 정 의 했 습 니 다.일치 하 는 문자열 에서 지역 번호 와 로 컬 번 호 를 직접 추출 할 수 있 습 니 다.

 
>>> m = re.match(r'^(\d{3})-(\d{3,8})$', '010-12345')
>>> m
<_sre.SRE_Match object at 0x1026fb3e8>
>>> m.group(0)
'010-12345'
>>> m.group(1)
'010'
>>> m.group(2)
'12345'
정규 표현 식 에서 그룹 을 정의 하면 Match 대상 에서 group()방법 으로 하위 문자열 을 추출 할 수 있 습 니 다.
group(0)은 영원히 원본 문자열 임 을 알 수 있 습 니 다.group(1),group(2).
하위 꼬치 추출 에 유용 합 니 다.더 잔인 한 예 를 보 자.

>>> t = '19:05:30'
>>> m = re.match(r'^(0[0-9]|1[0-9]|2[0-3]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])\:(0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]|[0-9])$', t)
>>> m.groups()
('19', '05', '30')
이 정규 표현 식 은 합 법 적 인 시간 을 직접 식별 할 수 있다.그러나 어떤 때 는 정규 표현 식 으로 도 날 짜 를 식별 하 는 등 완전히 검증 할 수 없다.'^(0[1-9]|1[0-2]|[0-9])-(0[1-9]|1[0-9]|2[0-9]|3[0-1]|[0-9])$''2-30','4-31'과 같은 불법 날 짜 는 정규 로 식별 할 수 없 거나 쓰기 가 매우 어렵다 고 말 할 때 프로그램 이 식별 에 협조 해 야 한다.
탐욕 일치
마지막 으로 특별히 지적 해 야 할 것 은 정규 일치 기본 값 은 탐욕 일치,즉 가능 한 한 많은 문자 와 일치 하 는 것 이다.예 를 들 어 다음 과 같이 숫자 뒤의 0 과 일치 합 니 다.

>>> re.match(r'^(\d+)(0*)$', '102300').groups()
('102300', '')
\d+탐욕 으로 일치 하기 때문에 뒤의 0 을 모두 일치 시 켰 습 니 다.결 과 는 0*빈 문자열 만 일치 할 수 있 습 니 다.
반드시\d+비 탐욕 매 칭(즉,가능 한 한 적 게 매 칭)을 사용 해 야 뒤의 0 을 매 칭 하고 개 를 추가 할 수 있 습 니까?\d+비 탐욕 매 칭 을 사용 할 수 있 습 니 다:

>>> re.match(r'^(\d+?)(0*)$', '102300').groups()
('1023', '00')
컴 파일
우리 가 Python 에서 정규 표현 식 을 사용 할 때 re 모듈 내부 에서 두 가지 일 을 합 니 다.
1.정규 표현 식 을 컴 파일 합 니 다.정규 표현 식 문자열 자체 가 합 법 적 이지 않 으 면 오류 가 발생 합 니 다.
2.컴 파일 된 정규 표현 식 으로 문자열 과 일치 합 니 다.
정규 표현 식 이 수천 번 반복 되 어야 한다 면 효율 적 인 고려 에서 우 리 는 이 정규 표현 식 을 미리 컴 파일 할 수 있 습 니 다.다음 에 중복 사용 할 때 이 절 차 를 컴 파일 할 필요 가 없습니다.직접 일치 합 니 다.

>>> import re
#   :
>>> re_telephone = re.compile(r'^(\d{3})-(\d{3,8})$')
#   :
>>> re_telephone.match('010-12345').groups()
('010', '12345')
>>> re_telephone.match('010-8086').groups()
('010', '8086')
컴 파일 후 Regular Expression 대상 을 생 성 합 니 다.이 대상 은 정규 표현 식 을 포함 하고 있 기 때문에 해당 하 는 방법 을 호출 할 때 정규 문자열 을 주지 않 아 도 됩 니 다.
작은 매듭
정규 표현 식 은 매우 강해 서 짧 은 절 에서 다 말 하 는 것 은 불가능 하 다.정칙 의 모든 내용 을 분명하게 말 하려 면 두 꺼 운 책 을 한 권 쓸 수 있다.정규 표현 식 에 문제 가 자주 발생 한다 면 정규 표현 식 참고서 가 필요 할 수도 있 습 니 다.
이메일 주 소 를 검증 하 는 정규 표현 식 을 써 보십시오.버 전 1 은 비슷 한 Email 을 검증 할 수 있 을 것 입 니 다.
[email protected]
[email protected]
python 에서 자주 사용 하 는 일치 문 자 를 정리 합 니 다:\w      알파벳 이나 숫자 와 일치 할 수 있 습 니 다.\d      일치 하 는 숫자\d+     여러 숫자 와 일치 할 수 있 습 니 다.\d+?    일부 숫자 와 일치 할 수 있 습 니 다(한 그룹)^       일치 하 는 줄 의 첫머리      일치 하 는 줄 끝^\d     첫 번 째 는 숫자 여야 합 니 다.\d$     마지막 하 나 는 숫자 여야 합 니 다.\s      공백 일치\d{3,8}           3-8 개의 숫자 일치[0-9a-zA-Z\_]     숫자,알파벳 또는 밑줄 을 일치 시 킬 수 있 습 니 다.[0-9a-zA-Z\_]+    최소한 하나의 숫자,자모 또는 밑줄 로 구 성 된 문자열 과 일치 할 수 있 습 니 다.예 를 들 어'a100','0 'Z','Py 3000'등등;[a-zA-Z\_][0-9a-zA-Z\_]*    알파벳 이나 밑줄 로 시작 한 다음 에 숫자,알파벳 또는 밑줄 로 구 성 된 문자열,즉 Python 의 합 법 적 인 변 수 를 연결 할 수 있 습 니 다.[a-zA-Z\_][0-9a-zA-Z\_]{0, 19}    변수의 길 이 를 1-20 글자(앞의 1 글자+뒤의 최대 19 글자)로 더욱 정확하게 제한 했다.    임의의 문자 일치    임의의 문자 일치(0 개 포함)    0 개 혹은 1 글자 일치+     최소 문자 일치{n}       n 글자{n,m}     n-m 문자

>>>'Demon is a good %s' % ('boy')
'Demon is a good boy'

위 에 있 는 일치 부 호 를 사용 할 수 있다 면 앞으로 정규 표현 식 을 사용 하면 많은 기능 을 할 수 있 습 니 다.손 을 댔 을 때 정규 가 강하 다 는 것 을 알 수 있 습 니 다.

좋은 웹페이지 즐겨찾기