Python 정규식


정규식은 문자열이 특정 패턴과 일치하는지 쉽게 확인하는 데 도움이 되는 특수 문자 시퀀스입니다.

Python은 버전 1.5부터 Perl 스타일 정규식 패턴을 제공하는 re 모듈을 추가했습니다.

re 모듈은 Python 언어에 완전한 정규식 기능을 제공합니다.

컴파일 함수는 패턴 문자열과 선택적 플래그 인수를 기반으로 정규식 개체를 생성합니다. 이 객체에는 정규식 일치 및 교체를 위한 일련의 메서드가 있습니다.

re 모듈은 패턴 문자열을 첫 번째 인수로 사용하는 이러한 메서드와 동일한 함수도 제공합니다.

이 장에서는 Python에서 일반적으로 사용되는 정규식 처리 함수를 주로 소개합니다.


re.match 함수

re.match는 문자열의 시작 위치에서 패턴 일치를 시도합니다. 시작 위치에서 일치에 실패하면 match()가 반환됩니다. 없음.

함수 구문:

re.match(pattern, string, flags=0)

함수 매개변수 설명:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

re.match 메서드는 일치에 성공하면 일치하는 개체를 반환합니다. 그렇지 않으면 None 을 반환합니다.

group(num) 또는 groups() 일치 개체 함수를 사용하여 일치하는 표현식을 얻을 수 있습니다.

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

인스턴스 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.match('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.match('com', 'www.php.cn'))         # 不在起始位置匹配

위 인스턴스의 출력은 다음과 같습니다.

(0, 3)
None

인스턴스 2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs"

matchObj = re.match( r'(.*) are (.*?) .*', line, re.M|re.I)

if matchObj:
   print "matchObj.group() : ", matchObj.group()
   print "matchObj.group(1) : ", matchObj.group(1)
   print "matchObj.group(2) : ", matchObj.group(2)
else:
   print "No match!!"

위 인스턴스의 실행 결과 인스턴스는 다음과 같습니다.

matchObj.group() :  Cats are smarter than dogs
matchObj.group(1) :  Cats
matchObj.group(2) :  smarter

re.search 방법

re.search는 전체 문자열을 스캔하고 첫 번째로 성공한 일치 항목을 반환합니다.

함수 구문:

re.search(pattern, string, flags=0)

함수 매개변수 설명:

参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。

re.search 메소드는 일치에 성공하면 일치하는 객체를 반환하고, 그렇지 않으면 None을 반환합니다.

group(num) 또는 groups() 일치 개체 함수를 사용하여 일치하는 표현식을 얻을 수 있습니다.

匹配对象方法描述
group(num=0)匹配的整个表达式的字符串,group() 可以一次输入多个组号,在这种情况下它将返回一个包含那些组所对应值的元组。
groups()返回一个包含所有小组字符串的元组,从 1 到 所含的小组号。

인스턴스 1:

#!/usr/bin/python
# -*- coding: UTF-8 -*- 

import re
print(re.search('www', 'www.php.cn').span())  # 在起始位置匹配
print(re.search('com', 'www.php.cn').span())         # 不在起始位置匹配

위 인스턴스의 출력은 다음과 같습니다.

(0, 3)
(11, 14)

인스턴스 2:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

searchObj = re.search( r'(.*) are (.*?) .*', line, re.M|re.I)

if searchObj:
   print "searchObj.group() : ", searchObj.group()
   print "searchObj.group(1) : ", searchObj.group(1)
   print "searchObj.group(2) : ", searchObj.group(2)
else:
   print "Nothing found!!"
위 인스턴스의 실행 결과는 다음과 같습니다. :
searchObj.group() :  Cats are smarter than dogs
searchObj.group(1) :  Cats
searchObj.group(2) :  smarter

re.match와 re.search의 차이점

re.match는 문자열의 시작 부분만 일치합니다. 문자열의 시작 부분이 정규 표현식과 일치하지 않으면 일치합니다. 실패하고 함수는 None을 반환하며 re.search는 일치하는 항목을 찾을 때까지 전체 문자열을 일치시킵니다.

예:

#!/usr/bin/python
import re

line = "Cats are smarter than dogs";

matchObj = re.match( r'dogs', line, re.M|re.I)
if matchObj:
   print "match --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"

matchObj = re.search( r'dogs', line, re.M|re.I)
if matchObj:
   print "search --> matchObj.group() : ", matchObj.group()
else:
   print "No match!!"
위 예의 결과는 다음과 같습니다:
No match!!
search --> matchObj.group() :  dogs

검색 및 교체

Python의 re 모듈은 문자열 일치 교체를 위한 re.sub를 제공합니다. .

구문:

re.sub(pattern, repl, string, max=0)

반환된 문자열은 문자열에서 가장 왼쪽의 반복되지 않는 RE 일치 항목으로 대체됩니다. 패턴을 찾을 수 없으면 문자는 변경되지 않은 채 반환됩니다.

선택적 매개변수 count는 패턴 일치 후의 최대 대체 수입니다. count는 음수가 아닌 정수여야 합니다. 기본값은 모든 일치 항목을 바꾸는 0입니다.

예:

#!/usr/bin/python
import re

phone = "2004-959-559 # This is Phone Number"

# Delete Python-style comments
num = re.sub(r'#.*$', "", phone)
print "Phone Num : ", num

# Remove anything other than digits
num = re.sub(r'\D', "", phone)    
print "Phone Num : ", num
위 예의 실행 결과는 다음과 같습니다.
Phone Num :  2004-959-559
Phone Num :  2004959559

정규식 수정자 - 선택적 플래그

정규식에는 일부 선택적 플래그 수정이 포함될 수 있습니다. 일치하는 패턴을 제어하는 ​​문자입니다. 수정자는 선택적 플래그로 지정됩니다. 여러 플래그는 비트 OR(|)로 지정할 수 있습니다. 예를 들어 re.I | re.M은 I 및 M 플래그로 설정됩니다.

修饰符描述
re.I使匹配对大小写不敏感
re.L做本地化识别(locale-aware)匹配
re.M多行匹配,影响 ^ 和 $
re.S使 . 匹配包括换行在内的所有字符
re.U根据Unicode字符集解析字符。这个标志影响 w, W, b, B.
re.X该标志通过给予你更灵活的格式以便你将正则表达式写得更易于理解。

정규 표현식 패턴

패턴 문자열은 특수 구문을 사용하여 정규 표현식을 나타냅니다.

문자와 숫자는 자신을 나타냅니다. 정규식 패턴의 문자와 숫자는 동일한 문자열과 일치합니다.

대부분의 문자와 숫자 앞에 백슬래시가 있으면 다른 의미를 갖습니다.

구두점은 이스케이프된 경우에만 일치하며, 그렇지 않은 경우에는 특별한 의미를 나타냅니다.

백슬래시 자체는 백슬래시로 이스케이프 처리해야 합니다.

정규식에는 일반적으로 백슬래시가 포함되므로 원시 문자열을 사용하여 이를 표현하는 것이 좋습니다. 패턴 요소(예: '//t'에 해당하는 r'/t')는 해당 특수 문자와 일치합니다.

다음 표에는 정규식 패턴 구문의 특수 요소가 나열되어 있습니다. 패턴을 사용하고 선택적 플래그 인수를 제공하면 일부 패턴 요소의 의미가 변경됩니다.

을 사용하지 마세요. 양수 구분 기호. ... 로 표시된 포함된 정규식이 현재 위치와 성공적으로 일치하면 성공하고, 그렇지 않으면 실패합니다. 그러나 포함된 표현식을 시도한 후에는 일치 엔진이 전혀 개선되지 않으며 패턴의 나머지 부분은 여전히 ​​구분 기호의 오른쪽을 시도해야 합니다. 앞으로 음수 구분 기호를 사용합니다. 양수 구분 기호 반대. 포함된 표현식이 문자열의 현재 위치에서 일치할 수 없는 경우 성공합니다. 독립 패턴 일치, 생략됨 Go 역추적. 영숫자 문자 및 밑줄과 일치영숫자가 아닌 문자 및 밑줄과 일치 는 공백 문자와 일치하며 [tnrf]와 동일합니다.와 일치합니다. 비어 있지 않은 문자 는 [0-9]에 해당하는 모든 숫자와 일치합니다.숫자가 아닌 모든 것과 일치문자열의 시작과 일치 줄바꿈이 있는 경우 문자열의 끝과 일치합니다. 줄바꿈 이전의 문자열 끝만 일치합니다. c는 문자열 의 끝과 일치합니다. 마지막 경기가 끝났습니다. 는 단어와 공백 사이의 위치를 ​​나타내는 단어 경계와 일치합니다. 예를 들어, 'erb'는 "never"의 'er'와 일치하지만 "동사"의 'er'와는 일치하지 않습니다. 는 단어가 아닌 경계와 일치합니다. 'erB'는 "동사"의 'er'와 일치하지만 "never"에서는 일치하지 않습니다. 은 개행 문자와 일치합니다. 탭 문자와 일치합니다. 는 n번째 그룹의 하위 표현식과 일치합니다. n번째 그룹의 하위 표현식이 일치하면 일치합니다. 그렇지 않으면 8진 문자 코드의 표현을 참조합니다. 정규식 예
패턴 설명
^ 문자열의 시작과 일치
$은 문자열의 끝과 일치합니다.
.은 개행 문자를 제외한 모든 문자와 일치합니다. re.DOTALL 플래그가 지정되면 개행 문자를 포함한 모든 문자와 일치할 수 있습니다.
[...]은 별도로 나열된 문자 그룹을 나타내는 데 사용됩니다. [amk]는 'a', 'm' 또는 'k'와 일치합니다.
[^...][]에 없는 문자: [^abc]는 a, b, c 이외의 문자와 일치합니다.
re*는 0개 이상의 표현식과 일치합니다.
re+는 하나 이상의 표현식과 일치합니다.
re? 탐욕스럽지 않은 방식으로 이전 정규식으로 정의된 0 또는 1개의 조각과 일치
re{ n}
re{ n,}n개의 이전 표현식과 정확히 일치합니다.
re{ n, m} 이전 정규식으로 정의된 프래그먼트의 n과 m을 탐욕스러운 방식으로 일치
a|b는 a 또는 b와 일치
(re)G는 괄호 안의 표현과 일치하며 그룹을 나타냅니다
(?imx)정규 표현식에는 세 가지 선택적 플래그(i, m 또는 x)가 포함되어 있습니다. 괄호 안의 영역에만 영향을 미칩니다.
(?-imx)i, m 또는 x 선택적 플래그를 끄는 정규식입니다. 괄호 안의 영역에만 영향을 미칩니다.
(?:re)는 (...)와 유사하지만 그룹을 대표하지 않습니다
(?imx : re) i, m 또는 x 선택적 플래그를 사용하여 괄호 안에
(?-imx: re) 사용 i, m 또는 x 선택적 플래그
(?#...) 주석(?= re)
(?! re)
(?> re)
w
W
s
S
d
D
A
Z
z
G
b
B
n, t 등
1...9
10
문자 일치

python

설명
实例描述
python匹配 "python".
은 "python"과 일치합니다.<🎜> < 🎜><🎜><🎜>

문자 클래스

实例描述
[Pp]ython匹配 "Python" 或 "python"
rub[ye]匹配 "ruby" 或 "rube"
[aeiou]匹配中括号内的任意一个字母
[0-9]匹配任何数字。类似于 [0123456789]
[a-z]匹配任何小写字母
[A-Z]匹配任何大写字母
[a-zA-Z0-9]匹配任何字母及数字
[^aeiou]除了aeiou字母以外的所有字符
[^0-9]匹配除了数字外的字符

특수문자 클래스

实例描述
.匹配除 "n" 之外的任何单个字符。要匹配包括 'n' 在内的任何字符,请使用象 '[.n]' 的模式。
d匹配一个数字字符。等价于 [0-9]。
D匹配一个非数字字符。等价于 [^0-9]。
s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ fnrtv]。
S匹配任何非空白字符。等价于 [^ fnrtv]。
w匹配包括下划线的任何单词字符。等价于'[A-Za-z0-9_]'。
W匹配任何非单词字符。等价于 '[^A-Za-z0-9_]'。