머리말
정규식에 대한 기본 지식은 다루지 않겠습니다. 관심이 있는 경우 여기를 클릭하면 됩니다. 하나는 에서 문자를 추출하는 것입니다. 텍스트의 단일 위치, 다른 하나는 여러 연속 위치의 문자열을 추출하는 것입니다. 로그 분석을 하다 보면 이런 상황이 발생하는데, 아래에서 해당 방법에 대해 이야기하겠습니다.
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 중국어 웹사이트의 기타 관련 기사를 참조하세요!