Python 학습 노트 - day 10 - 정규 표현 식
정규 표현 식
문자열 은 프로 그래 밍 할 때 가장 많이 언급 된 데이터 구조 로 문자열 을 조작 하 는 데 필요 한 곳 이 거의 없다.예 를 들 어 하나의 문자열 이 합 법 적 인 Email 주소 인지 아 닌 지 를 판단 할 수 있다.
정규 표현 식 은 문자열 과 일치 하 는 강력 한 무기 입 니 다.그것 의 디자인 사상 은 묘사 적 인 언어 로 문자열 에 규칙 을 정의 하 는 것 이다. 규칙 에 부합 되 는 문자열 이 라면 우 리 는 그것 이 일치 하 다 고 생각한다. 그렇지 않 으 면 이 문자열 은 비합법적 이다.
정규 표현 식 이 무엇 입 니까?
정규 표현 식 은 일반 문자 (예 를 들 어 문자 a 에서 z) 와 특수 문자 ('원 문자' 라 고 함) 로 구 성 된 문자 모드 입 니 다.패턴 설명 은 텍스트 를 검색 할 때 일치 하 는 문자열 하나 이상 을 설명 합 니 다.정규 표현 식 은 템 플 릿 으로 검색 한 문자열 과 일치 합 니 다.
정규 표현 식 의 특수 문자
정규 표현 식 이 제공 하 는 특수 문 자 는 매우 많 으 며, 기능 에 따라 다음 과 같은 몇 가지 유형 으로 나 뉜 다.
비 인쇄 문자
인쇄 되 지 않 은 문자 도 정규 표현 식 의 구성 부분 일 수 있 습 니 다.다음 표 는 인쇄 되 지 않 은 문 자 를 나타 내 는 전의 서열 을 보 여 줍 니 다.
문자
묘사 하 다.
\cx
x 가 가리 키 는 제어 문자 와 일치 합 니 다.예 를 들 어 \ cM 은 control - M 또는 리 턴 문자 와 일치 합 니 다.x 의 값 은 A - Z 또는 a - z 중 하나 여야 합 니 다.그렇지 않 으 면 c 를 원래 의 'c' 문자 로 간주 합 니 다.
\f
페이지 바 꾸 기 문자 와 일치 합 니 다.등가
줄 바 꿈 문자 와 일치 합 니 다.등가
\r
리 턴 부적 과 일치 합 니 다.등가
\s
빈 칸, 탭 문자, 페이지 바 꾸 기 등 모든 공백 문자 와 일치 합 니 다.등가
\S
공백 문자 가 아 닌 문자 와 일치 합 니 다.등가
\t
탭 문자 와 일치 합 니 다.등가
\v
수직 탭 문자 와 일치 합 니 다.등가
특수 문자
특수 문자 란 특수 한 의 미 를 가 진 문자 로 쉽게 말 하면 모든 문자열 의 뜻 을 나타 낸다.문자열 의 * 기호 * 전의 하 다.
많은 메타 문 자 는 그것들 과 일치 하려 고 할 때 특별 하 게 대해 야 한다.이 특수 문자 와 일치 하려 면 먼저 문 자 를 '전의', 즉 역 슬 래 쉬 문 자 를 \ \ 그들 앞 에 놓 아 라.다음 표 는 정규 표현 식 의 특수 문 자 를 보 여 줍 니 다:
특별 문자
묘사 하 다.
$
입력 문자열 의 끝 위치 와 일치 합 니 다.RegExp 대상 의 Multiline 속성 을 설정 하면 $도 '또는' \ r '와 일치 합 니 다.$문자 자체 와 일치 하려 면 \ $를 사용 하 십시오.
( )
하위 표현 식 의 시작 과 끝 위 치 를 표시 합 니 다.하위 표현 식 은 나중에 사용 할 수 있 도록 가 져 올 수 있 습 니 다.이 문자 들 과 일치 하려 면 \ (과 \) 를 사용 하 십시오.
*
앞의 하위 표현 식 과 0 회 또는 여러 번 일치 합 니 다.* 문자 와 일치 하려 면 \ * 를 사용 하 십시오.
+
앞의 하위 표현 식 과 한 번 또는 여러 번 일치 합 니 다.+ 문자 와 일치 하려 면 \ + 를 사용 하 십시오.
.
줄 바 꿈 자 를 제외 한 모든 문자 와 일치 합 니 다.일치 하려 면 \ 를 사용 하 십시오.
[
괄호 식 의 시작 을 표시 합 니 다. [일치 하려 면 \ [를 사용 하 십시오.
?
앞의 하위 표현 식 과 0 번 또는 한 번 일치 하거나 탐욕 이 아 닌 한정 자 를 가 리 킵 니 다. 일치 하려 면? 문 자 를 사용 하 십시오. \?
\
다음 문 자 를 특수 문자 나 원 의 문자 로 표시 하거나 뒤로 인용 하거나 8 진 전의 문자 로 표시 합 니 다. 예 를 들 어 'n' 은 문자 'n' 과 일치 합 니 다. '는 줄 바 꿈 문자 와 일치 합 니 다. 서열' \ \ '는' \ '와 일치 하고' \ ('는' (') 와 일치 합 니 다.
^
입력 문자열 의 시작 위치 와 일치 합 니 다. 괄호 식 에서 사용 하지 않 는 한 이 문자 집합 을 받 아들 이지 않 음 을 표시 합 니 다. ^ 문자 자체 와 일치 하려 면 \ ^ 를 사용 하 십시오.
{
한정 문자 식 의 시작 을 표시 합 니 다. {와 일치 하려 면 \ {를 사용 하 십시오.
|
두 항목 사이 의 선택 을 표시 합 니 다. 일치 하려 면 \ | 을 사용 하 십시오.
한정 부호
정규 표현 식 을 지정 하 는 데 사용 할 지정 한 구성 요 소 는 몇 번 이나 나타 나 야 일치 하 는 지 를 만족 시 킬 수 있 습 니 다. * 혹시 + 혹시 ? 혹시 {n} 혹시 {n,} 혹시 {n,m} 총 6 종.
정규 표현 식 의 한정 문자:
문자
묘사 하 다.
*
앞의 하위 표현 식 과 0 회 또는 여러 번 일치 합 니 다. 예 를 들 어 ldx * 는 "ldx" 와 "ldxx" 를 일치 시 킬 수 있 습 니 다. * 는 {0,} 과 같 습 니 다.
+
앞의 하위 표현 식 과 한 번 또는 여러 번 일치 합 니 다. 예 를 들 어 'ldx +' 는 'ldx' 와 'ldxx' 와 일치 하지만 'ld' 와 일치 하지 않 습 니 다. + 는 {1,} 과 같 습 니 다.
?
앞의 하위 표현 식 과 0 번 또는 한 번 일치 합 니 다. 예 를 들 어 "do (es)?" 는 "do" 또는 "does" 의 "does" 또는 "doxy" 의 "do" 와 일치 할 수 있 습 니 다.? 등 가 는 {0, 1} 입 니 다.
{n}
n 은 마이너스 정수 가 아 닙 니 다. 확 정 된 n 번 과 일치 합 니 다. 예 를 들 어 'o {2}' 은 'Bob' 의 'o' 와 일치 할 수 없 지만 'food' 의 두 o 와 일치 할 수 있 습 니 다.
{n,}
n 은 부정 정수 입 니 다. 최소한 n 번 은 일치 합 니 다. 예 를 들 어 'o {2,}' 은 'Bob' 의 'o' 와 일치 할 수 없 지만 'fooood' 의 모든 o 와 일치 합 니 다. 'o {1,}' 은 'o +' 와 같 습 니 다. 'o {0,}' 은 'o *' 와 같 습 니 다.
{n,m}
m 와 n 은 모두 마이너스 정수 입 니 다. 그 중에서 n < = m. 최소 n 회 와 최대 m 회 가 일치 합 니 다. 예 를 들 어 'o {1, 3}' 은 'foooood' 의 앞 세 o 와 일치 합 니 다. 'o {0, 1}' 은 'o?' 와 같 습 니 다. 쉼표 와 두 수 사이 에 빈 칸 이 없어 야 합 니 다.
re 모듈 사용
re.findall(expression,val)
val 의 왼쪽 에서 찾 아 모든 expression 에 일치 하 는 문자열 을 찾 고 list 로 저장 합 니 다.
# :
s = '1-2*(60+(-40.35/5.3+1.2)-(-4*3))'
num = re.findall('\-?\d+\.?\d*',s) # , ,
#
re.findall(r'\-?\d+\.\d+|(\-?\d+)','1-2*(60+(-40.35/5.3+1.2)-(-4*3))')
# (), () ,
re. search (expression, val) 는 value 의 왼쪽 에서 찾 습 니 다. expression 과 일치 하 는 대상 을 찾 습 니 다. 되 돌 릴 대상 을 찾 으 면 SRE 대상 으로 돌아 갑 니 다. 찾 지 못 하면 None 으로 돌아 갑 니 다. 대상 의. group () 방법 으로 일치 하 는 정 보 를 읽 습 니 다.
# :
s = '1-2*(60+(-40.35/5.3+1.2)-(-4*3))'
num = re.search('\-?\d+\.?\d*',s).group() # 1,
# :re.search('exp1|exp2',val) exp1,exp2 val , ,
s = '1.3-2*(60+(-40.35/5.3+1.2)-(-4*3))'
num = re.search('\-?\d+\.\d+|\-?\d+',s).group() # ,
re. match (expression, val) 는 value 에서 시작 하여 찾 고 일치 하면 SRE 대상 으로 돌아 가 며 일치 하지 않 으 면 None 으로 돌아 갑 니 다. 기능 은 ^ 와 유사 합 니 다.
# : a
s = 'daxin like Linux'
match = re.match('a',s) # None, re.match('d',s) d
sre 대상. group () 표현 식 그룹 구성
re.search('da(x)in mak(e)','daxin make love').group() # findall ?: , group(1), () e,group(2), () e。
# group(int) int , ,
# :
re.search('da(x)in mak(e)','daxin make love').group() # :daxin make
re.search('da(x)in mak(e)','daxin make love').group(1) # : e
re. split (expression, val) 는 val 을 expression 에 따라 분할 하고 정규 표현 식 에 따라 분할 하여 list 로 돌아 가 는 것 을 지원 합 니 다.
# :
s = r'9+63+2-(12*2)/9'
list1 = re.split('[0-9]',s) # :['', '+', '', '+', '-(', '', '*', ')/', '']
re.sub('sub1','sub2',string)
문자열 의 sub1 을 sub2 로 바 꿉 니 다.
# :
s = r'1.3-2*(60+(-40.35/5.3+1.2)-(-4*3))'
match = re.sub('-','A',s) # - , A
# :
re.sub('(\w+)(\s)(\w+)(\s)(\w)$',r'\5\2\3\4\1','daxin make love')
, , Linxu sed
re.compile(regex)
정규 표현 식 regex 를 컴 파일 하고 표현 식 대상 을 프로 그래 밍 한 다음 다른 모듈 (re. search, re. match) 에 전송 하여 일치 하 는 규칙 으로 일치 할 수 있 습 니 다.
import re
s = 'abcde fgh'
regex = re.compile('abc\S')
result = re.match(regex,s).group()
print(result)
메모: 정규 표현 식 을 컴 파일 하 는 것 은 필수 가 아니 지만 컴 파일 후 실행 속도 에 큰 도움 이 될 수 있 습 니 다. 따라서 정규 표현 식 이 여러 곳 에서 호출 된다 면 대상 으로 컴 파일 하 는 것 이 좋 습 니 다. 단 한 번 만 사용 하면 컴 파일 하지 않 아 도 됩 니 다.
넓히다
?P
? P 는 문자열 에 일치 하 는 대상 을 명명 합 니 다. (많은 곳 에서 사용 할 수 있 고 매우 편리 합 니 다.) 형식 은 다음 과 같 습 니 다.
# ?P
(?P )
# tagname
예시:
import re
s = 'abcde fgh'
regex = re.compile('(?Pabc\S)(\w*)(.*)')
result = re.match(regex,s).group('regex') # , group
result1 = re.match(regex,s).group(1) # regex
result2 = re.match(regex,s).group(2)
result3 = re.match(regex,s).group(3)
print(result)
print(result1)
print(result2)
print(result3)
좋 은 정규 표현 식 사 이 트 를 백업 합 니 다:https://regex101.com/
posted @
2017 - 11 - 14 16: 41 데 일리 안 읽 기
...) 댓 글 (
...) 모음 집 편집
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.