[Python 학습 노트] 정규 표현 식 요약

11589 단어
상용 줄 임 말 문자 및 의미 표 조회
줄 임 말 문자 분류
속뜻
\d
0 - 9 의 임 의 숫자
\D
0 - 9 의 숫자 를 제외 한 모든 문자
\w
모든 자모, 숫자 또는 밑줄 문자 ('단어' 문자 와 일치 하 는 것 으로 볼 수 있 습 니 다)
\W
알파벳, 숫자, 밑줄 을 제외 한 모든 문자
\s
빈 칸, 탭 문자 또는 줄 바 꿈 문자 ('공백' 문자 와 일치 하 는 것 으로 볼 수 있 습 니 다)
\S
빈 칸, 탭 문자, 줄 바 꿈 문 자 를 제외 한 모든 문자
?
물음 표 는 그룹 을 나 눈 뒤에 바짝 붙 어서 앞의 그룹의 내용 이 있 으 나 마 나 함 을 나타 낸다
*
별 표 는 그룹 을 나 눈 후 앞의 그룹 내용 이 0 회 또는 여러 번 일치 하 는 것 을 나타 낸다.
+
더하기 번 호 는 그룹 을 나 눈 후 앞 에 그룹 을 나 누 는 내용 과 최소 1 번 일치 합 니 다.
|
파이프 매 칭 여러 그룹
{}
괄호 안에 숫자 를 넣 으 면 특정한 글자 수 와 일치 함 을 나타 낸다.
.
문장 은 모든 문자 와 일치 합 니 다 (줄 바 꾸 기 제외)
Python 에서 정규 표현 식 을 사용 하 는 절차
Python 에서 정규 표현 식 을 사용 하 는 데 는 다음 과 같은 몇 가지 절차 가 있 습 니 다.
  • 정규 표현 식 모듈 을 import re 로 가 져 옵 니 다.
  • 함수 로 Regex 대상 을 만 듭 니 다.
  • Regex 대상 re.compile() 또는 search() 방법 으로 대상 문자열 을 입력 합 니 다.
  • Matches 대상 findall() 방법 을 호출 하여 실제 텍스트 와 일치 하 는 문자열 을 되 돌려 줍 니 다.

  • Python 정규 표현 식 상세 설명
    문자열 의 첫 번 째 따옴표 전에 r 를 추가 하여 group() 에 원본 문자열 을 전달 합 니 다.
    Python 에서 전의 문 자 는 역 슬 래 쉬 "\" 를 사용 합 니 다.만약 우리 가 "" 를 출력 해 야 한다 면, 전의 문 자 를 입력 해 야 역 슬 래 쉬 를 출력 할 수 있 습 니 다.그래서 "\" 는 역 슬 래 쉬 에 소문 자 n 을 표시 합 니 다.단, 문자열 의 첫 번 째 따옴표 앞 에 r 를 추가 하면 이 문자열 을 원본 문자열 로 표시 할 수 있 습 니 다. 전의 문 자 는 포함 되 지 않 습 니 다.
    괄호 로 묶 기
    만약 우리 가 아래 텍스트 의 전화 번 호 를 일치 시 키 고 지역 번 호 를 분리 하려 고 한다 면.정규 표현 식 에 괄호 를 추가 하여 '그룹' 을 만 들 수 있 습 니 다. re.compile()그리고 (\d\d\d)-(\d\d\d\d\d\d\d\d) 대상 과 일치 하 는 방법 을 사용 하여 두 번 째 그룹 에서 필요 한 텍스트 를 가 져 옵 니 다.정규 표현 식 문자열 의 첫 번 째 괄호 는 첫 번 째 그룹 이 고 두 번 째 괄호 는 두 번 째 그룹 입 니 다.group() 일치 하 는 대상 방법 에 정수 1 또는 2 를 입력 하면 일치 하 는 텍스트 의 다른 부분 을 얻 을 수 있 습 니 다.group() 방법 에 0 또는 파 라 메 터 를 전송 하지 않 으 면 일치 하 는 텍스트 전 체 를 되 돌려 줍 니 다. group() 방법 은 한 번 에 모든 그룹 을 가 져 올 수 있 습 니 다.(groups () 와 group (0) 의 차이 에 주의 하 십시오) 예 를 들 어:
    >>> import re
    >>> phoneNumRegex = re.compile(r"(\d\d\d)-(\d\d\d\d\d\d\d\d)")
    >>> mo = phoneNumRegex.search("My number is 029-88888888. ")
    >>> mo.group(1)
    '029'
    >>> mo.group(2)
    '88888888'
    >>> mo.group(0)
    '029-88888888'
    >>> mo.group()
    '029-88888888'
    >>> mo.groups()
    ('029', '88888888')

    파이프 로 여러 그룹 매 칭
    문자 "|" 를 "파이프" 라 고 합 니 다.여러 표현 식 중 하나 와 일치 하 기 를 원할 때 사용 할 수 있 습 니 다.예 를 들 어 정규 표현 식 groups() 은 'Kitty' 나 'Tiny' 와 일치 합 니 다.둘 다 텍스트 에 있 으 면 첫 번 째 로 나타 나 는 것 은 Match 대상 으로 되 돌아 갑 니 다.예 를 들 면:
    >>> nameRegex = re.compile(r"Kitty|Tiny")
    >>> mo1 = nameRegex.search("Tiny and Rose and Kitty. ")
    >>> mo1.group()
    'Tiny'

    만약 우리 가 Batman, Batwoman, Batcar, Batmobile 중의 어느 하나 와 일치 하 기 를 원한 다 면, 이 단어 들 은 모두 Bat 로 시작 되 기 때문에 접두사 한 번 만 지정 하면 매우 편리 할 것 이다.예 를 들 면:
    >>> nameRegex_2 = re.compile(r"Bat(man|woman|car|mobile)")
    >>> mo2 = nameRegex_2.search("Batt、Batmobile、Batwoman、Batcar、Batman")
    >>> mo2.group()
    'Batmobile'
    >>> mo2.group(1)
    'mobile'

    물음 표 는 그룹 을 나 눈 뒤에 바짝 붙 어서 앞의 그룹의 내용 이 있 으 나 마 나 함 을 나타 낸다
    예 를 들 어 전화번호 와 일치 하 는 예 에서 지역 번호 가 없 는 전화 번 호 를 만나면 앞의 예 에서 코드 가 일치 하지 않 습 니 다. 우 리 는 그룹 을 나 눈 후에 물음 표를 붙 여 해결 할 수 있 습 니 다.예 를 들 면:
    >>> phoneNumRegex_2 = re.compile(r"(\d\d\d-)?(\d\d\d\d\d\d\d\d)")
    >>> mo = phoneNumRegex_2.search("My phone number is 12356897. ")
    >>> mo.group()
    '12356897'

    별 표 는 그룹 을 나 눈 후 앞의 그룹 내용 이 0 회 또는 여러 번 일치 하 는 것 을 나타 낸다.
    간단 하 다
    >>> emRegex = re.compile(r"e(m)*")
    >>> mo = emRegex.search("emmmmmmmmmmm fuck trump. ")
    >>> mo.group()
    'emmmmmmmmmmm'

    더하기 번 호 는 그룹 을 나 눈 후 앞 에 그룹 을 나 누 는 내용 과 최소 1 번 일치 합 니 다.
    간단 하 다
    >>> emRegex = re.compile(r"e(m)+")
    >>> mo = emRegex.search("e fuck trump. ")
    >>> mo.group()
    Traceback (most recent call last):
      File "", line 1, in 
    AttributeError: 'NoneType' object has no attribute 'group'  #    
    >>> mo = emRegex.search("em fuck trump. ")
    >>> mo.group()
    'em'

    괄호 로 특정 횟수 를 매 칭 하 다
    그룹 을 나 누 어 특정 횟수 를 반복 하 는 텍스트 를 찾 으 려 면 이 그룹 뒤에 괄호 를 붙 이 고 그 숫자 는 중복 되 는 횟수 를 표시 합 니 다.예 를 들 어 (ha) {3} 문자열 "hahaha", (ha) {1, 3} 문자열 "ha", "haha" 또는 "hahaha" 와 일치 합 니 다.이 괄호 안의 규칙 은 배열 절편 의 규칙 과 같 습 니 다. 예 를 들 어 {3,} 은 3 회 이상 인 스 턴 스 와 일치 합 니 다.{, 5} 은 0 에서 5 번 의 인 스 턴 스 와 일치 합 니 다.예 를 들 면:
    >>> haRegex = re.compile(r"(ha){1,}")
    >>> mo = haRegex.search("hahahahahahahahahahah. ")
    >>> mo.group()
    'hahahahahahahahahaha'

    줄 바 꿈 자 를 제외 한 임의의 여러 문 자 를 r"Kitty|Tiny" 로 일치 시 킵 니 다.
    . 임의의 문자 (줄 바 꾸 기 제외) 와 일치 할 수 있 습 니 다. * 이전 그룹 에서 0 이상 반복 하 는 횟수 를 표시 합 니 다..* 조합 은 임의의 문자열 (줄 바 꿈 제외) 과 일치 할 수 있 습 니 다.
    욕심 과 비 욕심 이 일치 하 다.
    앞의 예 에서 .* 1 개 또는 다른 수량 ha 와 일치 할 수 있 지만 왜 가장 긴 것 으로 되 돌아 갑 니까?이것 은 Python 의 정규 표현 식 이 기본적으로 욕심 이 많 기 때 문 입 니 다. 이것 은 두 가지 의미 가 있 는 상황 에서 가장 긴 문자열 과 일치 한 다 는 것 을 의미 합 니 다.그 를 가장 짧 은 것 으로 돌려 보 내 려 면 욕심 이 없 는 것 이 되 려 면 괄호 뒤에 물음 표를 붙 여야 한다. 여기 서 는 앞에서 조 를 나 눈 후에 물음 표를 붙 이 는 것 이 있어 도 되 고 없어 도 된다 는 뜻 을 나타 내 는 것 을 주의해 야 한다.예 를 들 면:
    >>> haRegex = re.compile(r"(ha){1,}?")
    >>> mo = haRegex.search("hahahahahahahahahahah. ")
    >>> mo.group()
    'ha'
    (ha){1,} 방법 은 첫 번 째 일치 하 는 대상 을 되 돌려 주 고 search() 방법 은 일치 하 는 모든 문자열 을 되 돌려 줍 니 다.findall() 방법 은 Match 대상 을 되 돌려 줍 니 다. 이 대상 은 search() 방법 을 가지 고 있 습 니 다.group() 방법 은 목록 을 직접 되 돌려 주 고 목록 은 findall() 방법 이 없다.다음 과 같다.
    >>> import re
    >>> phoneNumRegex = re.compile(r"(\d\d\d-)?(\d\d\d\d\d\d\d\d)")
    >>> mo = phoneNumRegex.search("Home: 029-88618871, Office: 010-36758954. ")
    >>> mo
    <_sre.sre_match object="" span="(6," match="029-88618871">
    >>> mo.group()
    '029-88618871'
    >>> mo_2 = phoneNumRegex.findall("Home: 029-88618871, Office: 010-36758954. ")
    >>> mo_2
    [('029-', '88618871'), ('010-', '36758954')]
    >>> mo_2.group()
    Traceback (most recent call last):
      File "", line 1, in 
    AttributeError: 'list' object has no attribute 'group'

    요약:
  • 그룹 이 없 는 정규 표현 식 에 호출 되면 group() 방법 \d\d\d-\d\d\d\d\d\d\d\d 은 일치 하 는 문자열 의 목록 을 되 돌려 줍 니 다. 예 를 들 어 [029 - 88618871 ',' 010 - 36758954 '];
  • 그룹 이 있 는 정규 표현 식 에 호출 되면 findall() 방법 (\d\d\d-)?(\d\d\d\d\d\d\d\d) 은 문자열 의 원 그룹의 목록 을 되 돌려 줍 니 다. 각 그룹 은 원 그룹의 문자열 에 대응 합 니 다. 예 를 들 어 [('029 -' 88618871 '), (' 010 - ',' 36758954 ')].

  • 문자 분류 만 들 기
    일치 하고 싶 은 문 자 는 위의 줄 임 말 findall() 등에 서 너무 광범 위 하 다 고 생각 되면 괄호 로 자신의 문자 분 류 를 정의 할 수 있 습 니 다.예 를 들 어 [abcdeABCDE] 나 [a - ea - E] 는 'abcdeABCDE' 의 임의의 문자 와 일치 합 니 다.주의해 야 할 것 은 괄호 안에 있 는 일반적인 정규 표현 식 기호 가 해석 되 지 않 는 다 는 것 이다. 이것 은 "." 와 일치 할 때 "\." 등 을 입력 하지 않 아 도 된다 는 것 을 의미한다.
    왼쪽 괄호 뒤에 ^ 문 자 를 바짝 따 르 면 '비 문자 류' 를 얻 을 수 있 습 니 다.[^ a - eA - E] 와 같이 "abcdeABCDE" 를 제외 한 모든 문 자 를 한 번 에 일치 합 니 다.
    문자 와 달러 문자 삽입
    정규 표현 식 의 시작 부분 에 삽입 기호 (^) 를 사용 하면 일치 하 는 텍스트 를 찾기 시작 할 때 발생 해 야 한 다 는 것 을 나타 낸다.유사 한 것 은 정규 표현 식 의 끝 에 달러 기호 ($) 를 붙 여 이 문자열 이 정규 표현 식 으로 끝나 야 일치 할 수 있 음 을 나타 낸다.양 자 는 동시에 사용 할 수 있다.예 를 들 면:
    helloRegex = re.compile(r"^hello")
    >>> mo = helloRegex.search("oh, hello!")
    >>> mo_2 = helloRegex.search("hello, Kitty.")
    >>> mo == None
    True
    >>> mo_2
    <_sre.sre_match object="" span="(0," match="hello"/>

    문자열 바 꾸 기 \s\d\w 방법 사용 하기
    정규 표현 식 은 문자열 을 찾 을 수 있 을 뿐만 아니 라 찾 은 문자열 을 대체 할 수 있 습 니 다. Regex 대상 sub() 방법 은 두 문자열 인 자 를 입력 해 야 합 니 다.첫 번 째 매개 변 수 는 찾 은 문자열 을 대체 하 는 데 사 용 됩 니 다. 두 번 째 매개 변 수 는 찾 을 문자열 입 니 다.예 를 들 면:
    >>> findXiamenRegex = re.compile(r"Xiamen")
    >>> findXiamenRegex.sub("Xi'an", "Xiamen is the capital of Shaanxi.")
    "Xi'an is the capital of Shaanxi."

    입력 sub(), re.IGNORECASE, re.DOTALL 을 통 해 대소 문자, 일치 하 는 줄 바 꿈 문자, 다 중 줄 입력 정규 표현 식 을 무시 합 니 다.re.VERBOSE 에 re. IGNORECASE 나 re. I 인 자 를 입력 하면 일치 할 때 대소 문 자 를 무시 할 수 있 습 니 다.re. DOTALL 인 자 를 입력 하여 문장 이 줄 바 꿈 문자 와 일치 하도록 합 니 다.복잡 한 정규 표현 식 의 다 중 줄 입력 을 위해 re. VERBOSE 로 전 송 됩 니 다.re.compile() 여러 개 이상 의 3 개의 매개 변 수 를 동시에 입력 하 는 것 을 지원 하지 않 습 니 다. 우 리 는 파이프 기호 '|' 을 사용 하여 여러 개의 매개 변 수 를 전송 할 수 있 습 니 다.예 를 들 어 re.compile().
    작은 항목: 클립보드 에 있 는 핸드폰 번호, 전화 번호, 메 일 주 소 를 추출 하고 규범 화 된 형식 으로 바 꾸 어 클립보드 에 다시 쓰기 (다 하면 다 알 수 있 습 니 다)
    이 항목 은 다음 과 같은 몇 단계 로 나 눌 수 있다.
  • 클립보드 에서 텍스트 가 져 오기;
  • 텍스트 에 있 는 모든 핸드폰 번호, 전화 번호 와 메 일 주 소 를 찾 습 니 다.
  • 클립보드 에 붙 여 넣 습 니 다.

  • 먼저 우 리 는 인터넷 검색 을 통 해 국내 전화 번호 의 지역 번호 가 3 - 4 자리 이 고 모두 0 으로 시작 한 다 는 것 을 알 게 되 었 다.국내 휴대 전화 번 호 는 모두 1 로 시작 해 86 이나 + 86 접두사 가 들 어 있 을 수도 있다.
    코드 는 다음 과 같 습 니 다:
    #! python3
    # phoneAndEmail.py - Finds phone numbers and email addresses on the clipboard.
    
    import pyperclip
    import re
    
    # create phone number regex
    
    phone1_Regex = re.compile(r'''(
        (\+)?
        (86)?
        (1\d{2})
        (-|\s)?
        (\d{8})
        (\D)
    )''', re.VERBOSE)
    
    phone2_Regex = re.compile(r'''(
        (0\d{2,3})?
        [-]?
        (\d{8})
        (\-\d{1,4})?
    )''', re.VERBOSE)
    
    # create email regex
    emailRegex = re.compile(r'''(
        [a-zA-Z0-9._%+-]+
        @
        [a-zA-Z0-9.-]+
    )''', re.VERBOSE)
    
    # Find matches in clipboard text.
    text = str(pyperclip.paste())
    matches = []
    
    for groups in phone1_Regex.findall(text):
        phoneNum = groups[3] + groups[5]
        matches.append(phoneNum)
    
    for groups in phone2_Regex.findall(text):
        phoneNum = groups[1] + groups[2]
        if groups[3] is not None:
            phoneNum += groups[3]
        matches.append(phoneNum)
    
    for groups in emailRegex.findall(text):
        matches.append(str(groups))
    
    # Copy results to the clipboard.
    if len(matches) > 0:
        pyperclip.copy("
    ".join(matches)) print("Copied to clipboard: ") print("
    ".join(matches)) else: print("No phone numbers or email address found. ")

    핸드폰 번호 와 이메일 주소 가 들 어 있 는 텍스트 를 복사 해서 프로그램 을 실행 해 보 세 요.
    더 많은 Python 정규 표현 식
    더 많은 Python 정규 표현 식 내용: 공식 문서
    [Python 학습 노트] 시 리 즈 는 제 가 라 는 책 을 배 울 때 배 운 노트 입 니 다.자신 이 개념 과 코드 를 다시 한 번 두 드 려 서 자신의 기억 과 나중에 찾 아 볼 수 있 도록 한다.만약 당신 에 게 도움 이 된다 면 더욱 좋 을 것 입 니 다!
    다음으로 전송:https://www.cnblogs.com/dereen/p/python_regex.html

    좋은 웹페이지 즐겨찾기