정규 표현식은 복잡한 문자열을 검색하고 바꾸고 구문 분석하는 강력하고 표준적인 방법입니다. Python의 모든 정규 표현식은 re 모듈에 있습니다.
1개의 일반적인 일치
^문자열의 시작과 일치
$문자열의 끝과 일치
b단어의 경계와 일치
d는 모든 숫자와 일치
D는 숫자가 아닌 모든 문자와 일치
x?는 선택적 x와 일치(1 또는 0 x 문자와 일치)
x* x와 일치
x 0회 이상 + x와 일치
x{n,m} 1회 이상 최소 n회 최대 m회 x
(a| b |c)는 a와 일치하거나 b와 일치하거나 c와 일치합니다.
(x)는 일반적으로 re.search 함수에서 반환된 개체의 groups() 함수를 사용하여 메모리 그룹을 얻을 수 있습니다. Value
2 범용
#------------------------------------------------------------------------------- # coding: utf-8 # Purpose:正则表达式 # # Author: zdk # # Created: 26/02/2013 # Copyright: (c) zdk 2013 #------------------------------------------------------------------------------- import re if __name__ == '__main__': addr = "100 BROAD ROAD APT.3" print(re.sub("ROAD","RD",addr)) # 100 BRD RD APT.3 print(re.sub(r"\bROAD\b","RD",addr)) # 100 BROAD RD APT.3 pattern = ".*B.*(ROAD)?" print(re.search(pattern,"ROAD")) #None print(re.search(pattern,"B")) #<_sre.SRE_Match object at 0x0230F020><span style="background-color:#FAFAFA;font-family:Monaco, 'DejaVu Sans Mono', 'Bitstream Vera Sans Mono', Consolas, 'Courier New', monospace;font-size:1em;line-height:1.5;"> </span>
(1) re.sub("ROAD","RD",addr) re.sub 함수를 사용하여 문자열 addr을 검색하여 표현식 "ROAD" 공식에서
를 "RD"로 바꾸세요. (2) re.sub(r"bROADb","RD",addr), "b"는 Python에서 "단어 경계"를 의미합니다. 문자 ""는 문자열에서 이스케이프되어야 하며 이는 매우 번거로울 수 있으므로 Python은 접두사 r을 사용하여 문자열의 모든 문자가 이스케이프되지 않음을 나타냅니다.
(3) re.search(pattern, "ROAD") re 모듈에는 검색 기능이 있습니다. 이 함수에는 두 개의 매개변수가 있습니다. 하나는 정규식이고 다른 하나는 문자열입니다. 이 일치하는 개체는 하나의 메서드로 설명할 수 있으며, 일치하는 항목이 없으면 None이 반환됩니다.
느슨한 정규식 3개
위 내용은 모두 "compact" 형식의 표현으로, 지금은 표현의 의미가 명확하다고 해도 반드시 그럴 것이라는 보장은 없습니다. 몇 달이 지나도 읽을 수 있다는 것을 기억하세요. 따라서 Python에서는 소위 느슨한 정규식을 사용하여 인라인 문서의 요구 사항을 충족할 수 있으며 다음 두 가지 측면에서 일반 표현식과 두 가지 주요 차이점이 있습니다.
공백 문자를 무시합니다. 공백, 탭 및 캐리지 리턴은 자체적으로 일치하지 않습니다(느슨한 정규식에서 공백 문자를 일치시키려면 앞에 백슬래시 문자를 추가하여 이스케이프할 필요가 없습니다)
무시 댓글. 일반 Python 코드와 마찬가지로 주석은 # 기호로 시작하고 줄 끝에서 끝납니다.
#松散带有内联注释的正则表达式 pattern = """ ^ # begin of string M{0,3} # 0 to 3 M (CM|CD|D?C{0,3}) #CM or CD or D or D 0 to 3 C $ #end of string """ print(re.search(pattern,"MCM",re.VERBOSE)) #<_sre.SRE_Match object at 0x021BAF60> print(re.search(pattern,"M99",re.VERBOSE)) #None
(1) 느슨한 정규 표현식을 사용할 때 가장 중요한 점은 re 모듈의 상수인 추가 매개변수 re.VERBOSE를 전달해야 한다는 것입니다. 이는 일치해야 함을 나타냅니다. 정규식은 느슨한 정규식입니다. 패턴 공백과 주석은 무시되지만 동시에 가독성이 향상됩니다.
4개 사례 연구: 전화번호 구문 분석
은 다음 전화번호와 일치해야 합니다.
800-555-1212
800 555 1212
800.555.1212
(800)555-1212
1-800-555-1212
800-555-1212-1234
800 -555-1212x1234
800-555-1212 ext.1234
work 1-(800) 555,1212 #1234
다양한 형식이 있습니다. 800은 지역번호, 국번은 555, 전화번호 나머지 숫자는 1212입니다. 내선번호가 있는 분들은 내선번호가 1234라는 것을 알아두셔야 합니다
phonePattern = re.compile(r''' # don't match beginging of string (\d{3}) # 3 digits \D* #any number of non-digits (\d{3}) # 3 digits \D* #any number of non-digits (\d{4}) # 4 digits \D* #any number of non-digits (\d*) #any number of digits ''',re.VERBOSE) print(phonePattern.search('work 1-(800)555.1212 #1234').groups()) #('800', '555', '1212', '1234')
print(phonePattern.search('work 1-( 800)555.1212 #1234').groups()) #('800', '555', '1212', '1234')
(1) 느슨한 정규 표현식은 위와 같습니다. 먼저 3개의 숫자 지역 코드(첫 번째 문자부터 시작할 필요는 없으므로 ^는 사용되지 않음)와 일치한 다음 숫자가 아닌 문자와 일치하고 3개의 숫자 트렁크 번호와 일치한 다음 일치합니다. 숫자가 아닌 문자를 임의 개수로 일치시킨 다음 4 숫자와 일치하고 숫자가 아닌 문자를 임의 개수로 일치시킨 다음 숫자 내선 번호를 임의 개수로 일치시킨 다음 그룹 기능을 사용하여 그룹화하여 올바른 전화번호를 가져옵니다.