> 백엔드 개발 > 파이썬 튜토리얼 > Python은 정규식을 사용하여 문자열을 추출합니다.

Python은 정규식을 사용하여 문자열을 추출합니다.

高洛峰
풀어 주다: 2017-03-23 16:36:43
원래의
2677명이 탐색했습니다.

머리말
정규식에 대한 기본 지식은 다루지 않겠습니다. 관심이 있는 경우 여기를 클릭하면 됩니다. 하나는 에서 문자를 추출하는 것입니다. 텍스트의 단일 위치, 다른 하나는 여러 연속 위치의 문자열을 추출하는 것입니다. 로그 분석을 하다 보면 이런 상황이 발생하는데, 아래에서 해당 방법에 대해 이야기하겠습니다.
1. 단일 위치에서 문자열 추출
이 경우 정규식(.+?)을 사용하여 추출할 수 있습니다. 예를 들어 문자열 "a123b"의 경우 ab 사이의 값 123을 추출하려면 정규 표현식과 함께 findall을 사용할 수 있습니다. 그러면 상황과 일치하는 모든 조건이 포함된 목록이 반환됩니다.
코드는 다음과 같습니다:

import re
str = "a123b"
print re.findall(r"a(.+?)b",str)#
输出['123']
로그인 후 복사


1.1 탐욕 및 비탐욕 매칭
문자열 "a123b456b"가 있는 경우, 그리고 마지막 b 사이의 모든 값은 a와 처음 나타나는 b 사이의 값 대신에 ?를 사용하여 일반적인 탐욕 매칭과 비탐욕 매칭을 제어할 수 있습니다.
코드는 다음과 같습니다.

import re
str = "a123b456b"
print re.findall(r"a(.+?)b", str)
#输出['123']#?控制只匹配0或1个,所以只会输出和最近的b之间的匹配情况
print re.findall(r"a(.+)b", str)
#输出['123b456']
print re.findall(r"a(.*)b", str)
#输出['123b456']
로그인 후 복사


1.2 다줄 매칭
다줄 매칭을 원할 경우 re.S와 re.M 플래그를 추가합니다. 개행 문자와 일치합니다. 기본값은 개행 문자와 일치하지 않습니다.
코드는 다음과 같습니다.

str = "a23b\na34b"
re.findall(r"a(\d+)b.+a(\d+)b", str)
#输出[]
#因为不能处理str中间有\n换行的情况
re.findall(r"a(\d+)b.+a(\d+)b", str, re.S)
#s输出[('23', '34')]
로그인 후 복사


re.M을 추가한 후 ^$ 표시는 각 줄과 일치합니다. 기본적으로 ^ 및 $는 첫 번째 줄만 일치합니다.
코드는 다음과 같습니다.

str = "a23b\na34b"
re.findall(r"^a(\d+)b", str)
#输出['23']
re.findall(r"^a(\d+)b", str, re.M)
#输出['23', '34']
로그인 후 복사


2. 연속된 여러 위치의 문자열을 추출합니다.
이 경우

(?P<name>…)
로그인 후 복사

를 사용할 수 있습니다. 추출할 정규 규칙 표현식입니다. 예를 들어, 웹 서버 액세스 로그 라인이

'192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"'
로그인 후 복사

이고 이 로그 라인의 모든 콘텐츠를 추출하려는 경우 여러

(?P<name>expr)
로그인 후 복사

를 작성하여 추출할 수 있습니다. 이름은 임의로 변경할 수 있습니다. 위치 문자열로 명명된 변수에 대해서는 expr을 정규식으로 변경하여 위치를 추출할 수 있습니다.
코드는 다음과 같습니다.

import re
line ='192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" 
"Mozilla/5.0"'
reg = re.compile('^(?P<remote_ip>[^ ]*) (?P<date>[^ ]*) "(?P<request>[^"]*)" 
(?P<status>[^ ]*) (?P<size>[^ ]*) "(?P<referrer>[^"]*)" "(?P<user_agent>[^"]*)"')
regMatch = reg.match(line)
linebits = regMatch.groupdict()
print linebits
for k, v in linebits.items() :
 print k+": "+v
로그인 후 복사


출력 결과는 다음과 같습니다.

status: 200
referrer: 
request: GET /api HTTP/1.1
user_agent: Mozilla/5.0
date: 25/Oct/2012:14:46:34size: 44
remote_ip: 192.168.0.1
로그인 후 복사


요약
이상은 이 글의 전체 내용입니다. 모든 분들의 공부나 업무에 조금이라도 도움이 되었으면 좋겠습니다. 궁금한 점이 있으시면 메시지를 남겨주세요.

위 내용은 Python은 정규식을 사용하여 문자열을 추출합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿