짧 은 글 한 편 으로 고질병 을 없 애고 정규 공포 증 을 철저히 해결 하 자!
25610 단어 python 논도
정규 표현 식 의 규칙 은 어렵 고 어려워 초보 자 들 을 뒷걸음질 치 게 한다.사실 기본 개념 을 이해 하고 지식 점 을 조금 요약 하 며 정규 표현 식 을 익히 고 익히 는 것 도 어 려 운 일이 아니 라 약 30 분 이면 할 수 있다.우 리 는 정규 표현 식 의 학습 을 두 부분 으로 나 눌 수 있다.
첫 번 째 문 제 는 언어 와 상 관 없 이 정규 표현 식 의 문자 집합 과 특수 기호 집합, 그리고 몇 가지 규칙 을 알 아야 합 니 다.두 번 째 문 제 는 Python 에 내 장 된 정규 표현 식 표준 모듈 re 의 용법 입 니 다.
1. 정규 표현 식 의 표기 법
정규 표현 식 을 쓰 는 것 은 찾 고 싶 은 문자열 의 특징 을 규칙 적 으로 설명 하 는 것 입 니 다.예 를 들 어 아래 의 서법 은 소문 자로 구 성 된 길이 가 3 에서 8 자리 인 문자열 을 묘사 했다.
>>> pstr = r'[a-z]{3,8}'
이것 은 원생 문자열 (문자열 앞 표지 r, 역 슬 래 쉬 에 대해 특별한 처 리 를 하지 않 습 니 다) 입 니 다. 괄호 안에 사용 할 수 있 는 문자 집합 을 약 속 했 고 괄호 는 문자 의 최소 자릿수 와 최대 자릿수 를 약 속 했 습 니 다.유사 한 정규 표현 식 은 정규 표현 식 의 문자 집합 과 조합 규칙 을 설명 하 는 몇 가지 기 호 를 정의 합 니 다.아래 표 는 자주 사용 하 는 기호 와 의 미 를 열거 하 였 다.
기호.
설명 하 다.
.
줄 바 꿈 자 를 제외 한 임의의 문자 와 일치 합 니 다.
\
전의 문 자 는 뒤의 문 자 를 원래 의 뜻 으로 바 꿉 니 다.예 를 들 어 알파벳 n 을 줄 바 꿈 문자 로 바 꾸 었 다.
*
0 회 또는 여러 번 일치, {0,}
+
1 회 또는 여러 번 일치, {1,}
?
0 회 또는 1 회 일치, {0, 1}
^
문자열 시작 과 일치 합 니 다.여러 줄 모드 에서 각 줄 의 시작 과 일치 합 니 다.
$
문자열 의 끝 과 일치 합 니 다. 여러 줄 모드 에서 줄 의 끝 과 일치 합 니 다.
|
분 단 된 표현 식 중 임의의 것 과 일치 합 니 다. 왼쪽 에서 오른쪽으로 일치 합 니 다.
{ }
{m} 은 m 회, {m, n} 은 최소 m 회, n 회, {m,} 은 최소 m 회 일치 함 을 나타 낸다.
[ ]
일치 하 는 문자 집합, 문자 집합 내 ^ 반대 표시
( )
하위 표현 식
\d
일치 하 는 디지털 문자 집합, [0 - 9]
\D
비 디지털 문자 집합 과 일치 합 니 다. [^ 0 - 9] 과 같 습 니 다.
\s
빈 칸, 탭 위치, 리 턴, 줄 바 꾸 기 등 을 포함 한 공백 문자 집합 과 일치 합 니 다.
\S
비 어 있 는 문자 집합 일치
\w
밑줄 을 포함 한 숫자 와 알파벳 이 일치 하 며 [A - Za - z0 - 9] 와 같 습 니 다.
\W
밑줄 을 포함 한 숫자 와 알파벳 이외 의 문자 집합 과 일치 하 며 [^ A - Za - z0 - 9] 와 같 습 니 다.
이 기호 들 의 의미 와 용법 을 이해 하면 임의의 복잡 한 문자열 을 묘사 할 수 있다.다음은 약간 복잡 한 정규 표현 식 몇 개 입 니 다. 초보 자 도 쉽게 이해 할 수 있 을 것 입 니 다.
>>> pstr = r'[1-9]\d{2}' # 100 999
>>> pstr = r' ([1-9]\d*) ' # 0 ,
>>> pstr = r'color=(red|blue)' # color=red, color=blue,
2. 정규 표현 식 의 용법
비록 네 이 티 브 문자열 로 정규 표현 식 을 표시 하지만, 사용 할 때 아무런 문제 가 없 지만, 우 리 는 네 이 티 브 문자열 이 표시 하 는 정규 표현 식 을 re. copile () 로 패턴 대상 으로 컴 파일 하 는 것 에 더욱 익숙 하 다. 그러면 패턴 대상 의 여러 가지 방법 을 직접 사용 할 수 있다.
>>> import re
>>> pstr = r' ([1-9]\d*) '
>>> p = re.compile(pstr) #
정규 표현 식 의 패턴 대상 이 있 으 면 우리 가 무엇 을 해 야 하 는 지 알 아야 합 니 다.우 스 꽝 스 럽 게 들 리 지만, 이것 은 확실히 문제 이다. 우 리 는 자신 이 무엇 을 하려 고 하 는 지 정말 잘 모 를 때 가 많다.일반적으로 정규 표현 식 을 사용 하 는 것 은 이런 몇 가지 목적 에 불과 하 다.
2.1 모드 일치: match ()
패턴 매 칭 은 문자열 의 시작 위치 에서 시 작 됩 니 다. 시작 위치 문자 가 다 르 면 매 칭 이 실 패 됩 니 다.문자열 이 패턴 문자열 보다 길 면 일치 하 는 결과 에 영향 을 주지 않 습 니 다.
>>> s1 = ' 2020 '
>>> s2 = ' 2020 '
>>> s3 = ' 2020 '
>>> p = re.compile(r' ([1-9]\d*) ')
>>> result = p.match(s1) # s1
>>> print(result) #
<re.Match object; span=(0, 7), match=' 2020 '>
>>> result.group() # group()
' 2020 '
>>> result.groups()# groups()
('2020',)
>>> result = p.match(s2) # , s2
>>> print(result)
<re.Match object; span=(0, 7), match=' 2020 '>
>>> result = p.match(s3) # , s3
>>> print(result)
None
문자열 이 완전히 일치 하도록 요구 하려 면 정규 표현 식 마지막 에 $를 추가 해 야 합 니 다. 일치 하 는 문자열 의 끝 과 패턴 문자열 이 일치 하 기 를 기대 합 니 다.
>>> p = re.compile(r' ([1-9]\d*) $')
>>> result = p.match(s2) # $ , s2
>>> print(result)
None
2.2 모드 검색: search ()
패턴 대상 의 search () 방법 은 문자열 에서 일치 하 는 문자열 을 찾 습 니 다. 첫 번 째 일치 하 는 문자열 을 찾 으 면 되 돌아 갑 니 다.문자열 이 일치 하지 않 으 면 None 으로 돌아 갑 니 다.
>>> p = re.compile(r' ([1-9]\d*) ')
>>> result = p.search(s1)
>>> print(result) # s1
<re.Match object; span=(0, 7), match=' 2020 '>
>>> result.group()
' 2020 '
>>> result.groups()
('2020',)
>>> print(p.search(s2)) # s2
<re.Match object; span=(0, 7), match=' 2020 '>
>>> print(p.search(s3)) # s3
<re.Match object; span=(1, 8), match=' 2020 '>
>>> p = re.compile(r'^ ([1-9]\d*) $') #
>>> print(p.search(s2)) # s2
None
>>> print(p.search(s3)) # s3
None
2.3 모든 일치: findall ()
패턴 대상 의 findall () 방법 은 문자열 에 일치 하 는 모든 하위 문자열 을 목록 으로 되 돌려 줍 니 다.또한 패턴 대상 의 finditer () 는 findall () 과 유사 하 며 교체 기 에 불과 합 니 다.아래 의 여러 줄 텍스트 를 예 로 들 면 5 줄 11 열 수치 데 이 터 를 분석 해 야 합 니 다.
>>> txt = """
WDC for Geomagnetism, Kyoto
Hourly Equatorial Dst Values (REAL-TIME)
MARCH 2020
DAY 1 2 3 4 5 6 7 8 9 10
1 -19 -11 -10 -7 -8 -9 -11 -14 -15 -9
2 -12 -14 -14 -16 -15 -14 -12 -11 -12 -10
3 1 -3 -10 -9 -9 -9 -10 -10 -13 -9
4 -6 -3 -1 -2 -2 -3 -2 -3 -6 -3
5 1 3 3 3 0 -3 -2 -2 -1 2
"""
분석 을 통 해 알 수 있 듯 이 모든 데 이 터 는 이전에 적어도 하나의 빈 칸 이 있 는데 첫 번 째 열 이 정수 인 것 을 제외 하고 다른 열 데 이 터 는 플러스 와 마이너스 가 있다.행동 단위 로 한 줄 씩 처리 하기 때문에 패턴 컴 파일 장식 파 라 메 터 를 re. M 으로 지정 하고 패턴 문자열 의 첫 끝 에 ^ 와 $기 호 를 추가 해 야 합 니 다.이에 따라 정규 표현 식 을 쉽게 쓰 고 모든 데 이 터 를 분석 할 수 있 습 니 다.
>>> p = re.compile('^\s([1-5])\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)\s+(-?\d+)$', flags=re.M)
>>> result = p.findall(txt)
>>> result
[('1', '-19', '-11', '-10', '-7', '-8', '-9', '-11', '-14', '-15', '-9'), ('2', '-12', '-14', '-14', '-16', '-15', '-14', '-12', '-11', '-12', '-10'), ('3', '1', '-3', '-10', '-9', '-9', '-9', '-10', '-10', '-13', '-9'), ('4', '-6', '-3', '-1', '-2', '-2', '-3', '-2', '-3', '-6', '-3'), ('5', '1', '3', '3', '3', '0', '-3', '-2', '-2', '-1', '2')]
2.4 문자열 분할: split ()
패턴 대상 의 split () 방법 은 일치 하 는 하위 문자열 로 문자열 을 분할 한 후 얻 은 목록 을 되 돌려 줍 니 다. 하위 문자열 이 없 으 면 빈 목록 으로 돌아 갑 니 다.다음 예 는 문장 부호 로 문자열 을 분할 하 는 것 을 보 여 줍 니 다.정규 표현 식 을 사용 하지 않 으 면 이 기능 을 실현 하기 어렵다.
>>> s = ' , 。 ? '
>>> p = re.compile(r'[,。?]')
>>> p.split(s)
[' ', ' ', ' ', ' ']
2.5 하위 문자열 교체: sub ()
패턴 대상 의 sub () 방법 은 짝 짓 기 문자열 을 지정 한 내용 으로 바 꾼 문자열 을 되 돌려 줍 니 다.아래 코드 는 모든 문장 부 호 를 플러스 (+) 로 바 꾸 는 것 을 보 여 줍 니 다.물론 이곳 의 문장 부호 집 은 세 개의 요소 만 열거 되 어 있다.
>>> s = ' , 。 ? '
>>> p = re.compile('[,。?]')
>>> p.sub('+', s)
' + + + '