일상 작업에서 텍스트의 특정 위치에서 문자열을 추출해야 하는 경우가 종종 있다고 생각합니다. Python은 규칙성이 매우 뛰어나고 이러한 문자열을 추출하는 데 매우 적합하므로 이 기사에서 자세히 설명합니다. 추출 기술은 샘플 코드를 통해 설명되어 있어 누구나 이해하는데 큰 도움이 됩니다. 도움이 필요한 친구들이 함께 와서 배울 수 있습니다.
서문
정규식에 대한 기본 지식은 다루지 않겠습니다. 관심이 있으시면 여기를 클릭하세요. 일반적으로 추출에는 두 가지 상황이 있는데, 하나는 텍스트의 한 위치에서 문자열을 추출하는 것이고, 다른 하나는 여러 개의 연속된 위치에서 문자열을 추출하는 것입니다. 로그 분석을 하다 보면 이런 상황이 발생하는데, 아래에서 해당 방법에 대해 이야기하겠습니다.
1. 단일 위치에서 문자열 추출
이 경우 정규식(.+?)을 사용하여 추출할 수 있습니다. 예를 들어 문자열 "a123b"의 경우 ab 사이의 값 123을 추출하려면 정규 표현식과 함께 findall을 사용할 수 있습니다. 그러면 상황과 일치하는 모든 조건이 포함된 목록이 반환됩니다.
코드는 다음과 같습니다.
import re str = "a123b" print re.findall(r"a(.+?)b",str)# 输出['123']
1.1 탐욕과 비욕심 매칭
문자열 "a123b456b"가 있는 경우 a와 첫 번째 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.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. 연속된 여러 위치의 문자열 추출
이 경우 (?P8a11bc632ea32a57b3e3693c7987c420…)
정규식을 사용하여 추출할 수 있습니다. 예를 들어, 웹 서버의 액세스 로그 라인이 '192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"'
이고 이 로그 라인의 모든 내용을 추출하려는 경우 (?P8a11bc632ea32a57b3e3693c7987c420expr)
을 여러 개 작성하여 추출하고 이름을 변수로 변경할 수 있습니다. 위치 문자열의 이름을 지정했다면 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
출력 결과는
아아아아요약
위 내용은 Python은 정규식을 교묘하게 사용하여 문자열을 얻습니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!