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')는 해당 특수 문자와 일치합니다.
다음 표에는 정규식 패턴 구문의 특수 요소가 나열되어 있습니다. 패턴을 사용하고 선택적 플래그 인수를 제공하면 일부 패턴 요소의 의미가 변경됩니다.
패턴 | 설명 |
---|---|
^ | 문자열의 시작과 일치 |
$ | 은 문자열의 끝과 일치합니다. |
. | 은 개행 문자를 제외한 모든 문자와 일치합니다. 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". |
문자 클래스
实例 | 描述 |
---|---|
[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_]'。 |