Heim  >  Artikel  >  Backend-Entwicklung  >  Python verwendet geschickt reguläre Ausdrücke, um Zeichenfolgen zu erhalten

Python verwendet geschickt reguläre Ausdrücke, um Zeichenfolgen zu erhalten

高洛峰
高洛峰Original
2017-03-11 10:43:111613Durchsuche

Ich glaube, dass Sie in Ihrer täglichen Arbeit häufig auf die Notwendigkeit stoßen, Zeichenfolgen an bestimmten Positionen im Text zu extrahieren. Python weist eine sehr gute Regelmäßigkeit auf und eignet sich sehr gut zum Extrahieren solcher Zeichenfolgen Extraktionstechniken werden durch Beispielcode erklärt, der für alle verständlich ist. Freunde in Not können zusammenkommen und lernen.

Vorwort

Wenn Sie interessiert sind, können Sie hier klicken Im Allgemeinen gibt es zwei Situationen für die Extraktion: Eine besteht darin, Zeichenfolgen an einer einzelnen Position im Text zu extrahieren, und die andere darin, Zeichenfolgen an mehreren aufeinanderfolgenden Positionen zu extrahieren. Bei der Protokollanalyse wird diese Situation auftreten, und ich werde im Folgenden auf die entsprechenden Methoden eingehen.

1. String-Extraktion an einer einzelnen Position

In diesem Fall können wir zum Extrahieren den regulären Ausdruck (.+?) verwenden. Wenn wir beispielsweise für eine Zeichenfolge „a123b“ den Wert 123 zwischen ab extrahieren möchten, können wir findall mit einem regulären Ausdruck verwenden, der eine Liste mit allen übereinstimmenden Situationen zurückgibt.

Der Code lautet wie folgt:

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

1.1 Greedy- und Non-Greedy-Matching

Wenn wir eine Zeichenfolge „a123b456b“ haben, können wir alle Werte zwischen a und dem letzten b abgleichen, anstatt den Wert zwischen a und dem ersten Vorkommen von b -gieriges Matching.

Der Code lautet wie folgt:

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 Mehrzeilenabgleich

Wenn Sie mehr möchten. Wenn die Zeilen übereinstimmen, müssen Sie die Flags re.S und re.M hinzufügen. Stimmt mit Zeilenumbruchzeichen überein, standardmäßig nicht.

Der Code lautet wie folgt:

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')]

Nach dem Hinzufügen von re.M stimmt die ^$-Markierung mit jeder Zeile überein, der Standardeinstellung ^ und $ Nur die erste Zeile wird abgeglichen.

Der Code lautet wie folgt:

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

2. String-Extraktion mehrerer aufeinanderfolgender Positionen

In diesem Fall können wir zum Extrahieren den regulären Ausdruck (?P8a11bc632ea32a57b3e3693c7987c420…) verwenden. Wenn wir beispielsweise eine Zeile im Zugriffsprotokoll des Webservers haben: '192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"' und wir den gesamten Inhalt dieser Protokollzeile extrahieren möchten, können wir mehrere (?P8a11bc632ea32a57b3e3693c7987c420expr) zum Extrahieren schreiben und den Namen in die Variable ändern Sie haben für die Positionszeichenfolge benannt, expr kann in den regulären Ausdruck der Extraktionsposition geändert werden.

Der Code lautet wie folgt:

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(&#39;^(?P<remote_ip>[^ ]*) (?P<date>[^ ]*) "(?P<request>[^"]*)" 
(?P<status>[^ ]*) (?P<size>[^ ]*) "(?P<referrer>[^"]*)" "(?P<user_agent>[^"]*)"&#39;)
regMatch = reg.match(line)
linebits = regMatch.groupdict()
print linebits
for k, v in linebits.items() :
 print k+": "+v

Das Ausgabeergebnis ist:

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

Zusammenfassung

Das obige ist der detaillierte Inhalt vonPython verwendet geschickt reguläre Ausdrücke, um Zeichenfolgen zu erhalten. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn