정규 표현 식 의 기본 사용 2018 - 07 - 30

9385 단어
정규 표현 식 은 프로 그래 밍 과정 에서 문자열 모드 인식, 문자열 처 리 를 하 는 강력 한 도구 입 니 다.일부 자동 동기 이론 을 배 워 보면 정규 표현 식 이 가난 한 자동 동기 라 는 것 을 알 수 있 고 식별 할 수 있 는 문자열 집합 을 언어 라 고 부른다.정규 표현 식 은 선형 적 이 고 비 귀속 적 인 문법 을 사용 하고 유한 한 상하 문 관련 문법 을 제공한다.
기호.
  • 글자 액면가 표현 식
  • 그냥 표시 되 지 않 은 문자열 입 니 다.
    text = r'this is a sample text'
    
    print(re.findall(r'is a',text))
    for i in re.finditer(r'is a',text):
        print(i.group(),i.start())
    
    <<< ['is a']
    <<< is a 5
    
  • 또는 표현 식 re1|re2
  • 두 정규 언어 와 일치 하 는 집합 에 사용 할 다음 예 는 '-' 또는 '|' 을 사용 하여 문자열 을 분할 합 니 다.
    text = r'123/123-4212-4242/23543'
    
    for item in re.split(r'(?:/|-)',text):
        print(item)
    
    <<< 123
    <<< 123
    <<< 4212
    <<< 4242
    <<< 23543
    
  • . 모든 문자 와 일치 합 니 다 (제외)
  • text = r'123/123-42abc12-4242/23543'
    print(re.findall(r'-.......-',text))
    
    <<< ['-42abc12-']
    
  • ^ 문자열 의 시작 부분 과 일치 합 니 다
  • text = r'123qwe123'
    
    for it in re.finditer(r'^123',text):
        print(it.start())
    
    <<< 0
    
  • $ 문자열 종료 부분 일치
  • 
    text = r'123qwe123'
    
    for it in re.finditer(r'123$',text):
        print(it.start())
    
    <<< 6
    
  • * 0 회 또는 여러 번 앞 에 나타 난 정규 표현 식
  • 과 일치 합 니 다.
    text = r'''\
    Cool     Things
    Cool Things
    CoolThings
    '''
    print(re.findall(r'\w\w\w\w\s*\w\w\w\w\w\w',text))
    
    <<< ['Cool     Things', 'Cool Things', 'CoolThings']
    

    Cool 과 Things 사이 에 하나 이상 의 빈 칸 이 있 거나 없 을 수 있 습 니 다.
  • + 한 번 또는 여러 번 앞 에 나타 난 정규 표현 식
  • 과 일치 합 니 다.
    text = r'''\
    Cool     Things
    Cool Things
    CoolThings
    '''
    print(re.findall(r'\w\w\w\w\s+\w\w\w\w\w\w',text))
    
    <<< ['Cool     Things', 'Cool Things']
    

    Cool 과 Things 사이 에 하나 이상 의 빈 칸 이 있 을 수 있 습 니 다.
  • ? 0 회 또는 1 회 앞 에 나타 난 정규 표현 식
  • 과 일치 합 니 다.
    text = r'''\
    Cool     Things
    Cool Things
    CoolThings
    '''
    print(re.findall(r'\w\w\w\w\s?\w\w\w\w\w\w',text))
    
    <<< ['Cool Things', 'CoolThings']
    

    Cool 과 Things 사이 에 빈 칸 이 있 거나 없 을 수 있 습 니 다.
  • {N} N 회 앞 에 나타 난 정규 표현 식
  • 과 일치 합 니 다.
    앞의 대량 중복 개선
    text = r'''\
    Cool     Things
    Cool Things
    CoolThings
    '''
    print(re.findall(r'\w{4}\s*\w{6}',text))
    
    <<< ['Cool     Things', 'Cool Things', 'CoolThings']
    
  • {M,N} M ~ N 회 앞 에 나타 난 정규 표현 식 과 일치 합 니 다
  • text = '''\
    www.baidu.com
    www.google.com
    www.360.com
    www.errorformat
    '''
    
    for it in re.finditer(r'www(\.\w+){2,3}',text):
        print(it.group())
    
    <<< www.baidu.com
    <<< www.google.com
    <<< www.360.com
    
  • […] 문자 집합 에서 온 임의의 단일 문자
  • 와 일치 합 니 다.
    모음 자모의 위 치 를 찾아내다
    
    text = '''\
    I believe, for every drop of rain
    that falls, A flower grows...
    I believe that somewhere in the
    darkest night, A candle glows...
    '''
    
    for it in re.finditer(r'(?i)[aeiou]',text):
        print(it.start(),end=' ')
    
    <<< 0 3 5 6 8 12 15 17 23 26 30 31 36 40 46 50 52 57 64 67 69 70 72 76 80 82 85 87 89 94 97 100 105 111 114 118 122
    
  • [..x−y..] x ~ y 범위 의 임의의 단일 문자
  • 와 일치 합 니 다.
    8 진수 가 될 문자열 을 찾 아 라.
    text = '''\
    adas a1290 21469
    12412 762 10923
    aeqw
    '''
    
    for it in re.finditer(r'\b[0-7]+\b',text):
        print(it.group(),end=' ')
    
    <<< 12412 762
    
  • [^…] 이 문자 가 집중 적 으로 나타 나 는 모든 문자 와 일치 하지 않 습 니 다. 특정한 범위 의 문자 (이 문자 가 집중 적 으로 나타 나 면)
  • 를 포함 합 니 다.
    숫자 가 없 는 비 공백 단 어 를 찾아내다
    text = '''\
    adas a1290 21469
    12412 762 10923
    aeqw
    '''
    print(repr(text))
    for it in re.finditer(r'\b[^0-9\s]+\b',text):
        print(it.group(),end=' ')
    
    <<< adas aeqw
    
  • (…) 폐쇄 된 정규 표현 식 과 일치 한 다음 하위 그룹
  • 으로 저장 합 니 다.
    조합 디자인 모드 의 맛 이 있 습 니 다. () 내 에 도 완전한 정규 표현 식 입 니 다. 하위 그룹 추출 에 사용 할 수 있 습 니 다.
    text = '''\
    11/27/1997
    5/22/1998
    2/29/1996
    '''
    
    print(repr(text))
    for it in re.finditer(r'(\d+)/(\d+)/(\d+)',text):
        print(it.group(3),' ',it.group(1),' ',it.group(2),' ')
    
    <<< 1997   11   27  
    <<< 1998   5   22  
    <<< 1996   2   29  
    
  • (*|+|?|{})? 위 에 자주 나타 나 거나 반복 되 는 기호 와 일치 하 는 비 탐욕 버 전 (*, +,?, {})
  • 그 행 위 는 탐욕 과 반대로 탐욕 이 일치 하 는 문 자 는 가능 한 한 많이 일치 하고 거 슬러 올 라 갈 때 일치 하 는 문 자 를 줄인다.탐욕 이 아 닌 매 칭 은 가능 한 한 적 게 일치 하고 거 슬러 올 라 갈 때 일치 하 는 문 자 를 추가 합 니 다.
    text = '''\
    3.1415926
    3.14
    '''
    
    print(repr(text))
    for it in re.finditer(r'\d+\.[\d]{4,6}?',text):
        print(it.group())
    
    <<< 3.1415
    

    특수 문자
    앞 에 \ w \ b \ d 와 같은 특수 기호 가 많이 나 타 났 습 니 다. 다음은 다음 과 같 습 니 다.
  • \d 는 10 진 숫자 와 일치 합 니 다. [0 - 9] 와 일치 합 니 다 \D\d 와 반대 되 고 그 어떠한 비 수치 형 숫자 도 일치 하지 않 습 니 다. 예 를 들 어 data\d+.txt 는 data1. txt, data2. txt 와 일치 합 니 다.
  • \w 은 모든 자모 숫자 문자 와 일치 하고 [A-Za-z0-9_] 와 같다 \W. 예 를 들 어 식별 자 는 [a-zA-Z_]\w+
  • \s 모든 빈 칸 문자 와 일치 하 며 [
    \t\r\v\f]
    와 같 습 니 다 \S 와 반대) 예 를 들 어 You\sare\sthe\winner
  • \b 모든 단어 경계 \B 와 반대) 예 를 들 어 \bThe\b
  • \N 저 장 된 하위 그룹 N 과 일치 합 니 다 (위의 (...)
  • 두 번 째 숫자 와 첫 번 째 숫자 를 접두사 로 하 는 문자열 이 일치 합 니 다.
    text = '''\
    3.14  3.1415926 
    '''
    
    m = re.match(r'(\d+\.\d+)\s+(\1\d+)',text)
    if m is not None:
        print(m.group(1),m.group(2))
    
    <<< 3.14 3.1415926
    
  • \c 글자 마다 모든 특수 문자 c (즉, 글자 의 의미 에 따라 만 일치 하고 특수 한 의미 와 일치 하지 않 음) c 를 포함 합 니 다. \ '[] {} ()? + * 등 정규 표현 식 에 사용 되 는 태그 기호
  • \A(\Z) 일치 하 는 문자열 의 시작 (끝) (위 에서 소개 한 ^$ 예 를 들 어 \ADear
  • 정규 표현 식 확장
  • (?iLmsux) 정규 표현 식 에 하나 이상 의 특수 '태그' 인자 (또는 함수 / 방법 을 통 해) 를 삽입 합 니 다.
  • 사용 시 (?...) 는 하나 이 며 정규 표현 식 의 가장 왼쪽 끝
  • 에 있 습 니 다.
  • (?i) 대소 문 자 를 무시 하 는 데 사 용 됩 니 다. 앞에서 보 여 준 모음 자 모 는 r'(?i)[aeiou]'
  • 을 사 용 했 습 니 다.
  • (?m) 문자열 을 전체 로 보 는 것 이 아니 라 줄 간 검색 을 실현 합 니 다. ^& 줄 마다 의 끝
  • 과 일치 할 수 있 습 니 다.
  • (?s) 로 하여 금 . 줄 바 꿈 문자
  • 와 일치 하 게 할 수 있 습 니 다.
  • (?x) 이 표 시 는 사용자 가 정규 표현 식 에서 공백 문자 (문자 클래스 나 반사 선 전의 제외) 를 사용 하 는 것 을 억제 함으로써 읽 기 쉬 운 정규 표현 식 을 만 들 수 있 도록 합 니 다.
  • (?:…) 저장 하지 않 은 그룹 과 일치 하 는 그룹 을 표시 합 니 다. 이 표 시 를 사용 하면 그룹 은 matchObj. groups () 에 저장 되 지 않 습 니 다
  • .
  • (?P…) 숫자 ID 가 아 닌 name 표지 만 있 는 정규 그룹 과 일치 하 는 것 처럼 그룹 이름 을 지 을 수 있 습 니 다
  • (?P=name) 같은 문자열 에서 (? P = name) 로 구 성 된 이전 텍스트
  • 와 일치 합 니 다.
    이전의 예 를 고 쳐 쓰다.
    text = '''\
    3.14  3.1415926 
    '''
    
    m = re.match(r'(?P\d+\.\d+)\s+((?P=prefix)\d+)',text)
    if m is not None:
        print(m.group(1),m.group(2))
    
    <<< 3.14 3.1415926
    
    sub 방법 에서 g 로 그룹 명 을 검색 할 수 있다.
    text = '''\
    11/27/1997\
    '''
    
    res = re.sub(r'(?P\d+)/(?P\d+)/(?P\d+)',r'\g/\g/\g',text)
    print(res)
    
    <<< 27/11/1997
    
  • (?#…) 주석 을 표시 하고 모든 내용 이 무시 되 었 습 니 다
  • (?=…) 일치 조건 은... 다음 위치 에 나타 나 면 입력 문자열 을 사용 하지 않 고 정방 향 전시 단언
  • 이 라 고 합 니 다.
    일치 할 때 앞으로 접미사 매 칭 을 시도 하고 접미사 가 성공 하면 접두사 와 일치 한 다 는 뜻 입 니 다.
    text = '''\
    11/27/1997\
    '''
    
    for it in re.finditer(r'\d{1,2}/\d{1,2}(?=/\d{4})',text):
        print(it.group())
    
    <<< 11/27
    
  • (?!…) 일치 조건 은... 다음 위치 에 나타 나 지 않 으 면 입력 문자열 을 사용 하지 않 습 니 다. 마이너스 전진 단언
  • 이 라 고 합 니 다.(?=…) 과 반대로 접미사 가 일치 하지 않 으 면 접두사 와 일치 합 니 다.
  • (?<=…) 일치 조건 은... 이전 위치 에 나타 나 면 입력 문자열 을 사용 하지 않 고 정방 향 백 엔 드 단언
  • 이 라 고 합 니 다.
    접 두 사 를 검사 합 니 다. 접두사 가 일치 하면 접두사 가 일치 합 니 다.
    text = '''\
    ABC12345 qd7654\
    '''
    print(text)
    print()
    for it in re.finditer(r'(?<=[a-zA-Z]{3})\d+',text):
        print(it.group())
    
    <<< 12345
    
  • (? … , ;

  • 접 두 사 를 검사 합 니 다. 접두사 가 일치 하지 않 으 면 접두사 와 일치 합 니 다.
  • (?(id/name)Y|N ) 그룹 이 제공 하 는 id 또는 name (이름) 이 존재 하면 정규 표현 식 의 조건 일치 Y 를 되 돌려 주 고 존재 하지 않 으 면 되 돌려 줍 니 다 N. |N 옵션
  • 좋은 웹페이지 즐겨찾기