Python は正規表現を巧みに使って文字列を取得します

高洛峰
リリース: 2017-03-11 10:43:11
オリジナル
1630 人が閲覧しました

日常の仕事で、テキスト内の特定の位置の文字列を抽出する必要に遭遇することがよくあると思います。Python は非常に規則性があり、そのような文字列を抽出するのに非常に適しています。そのため、この記事では抽出プロセスについて詳しく説明します。サンプルコードによるテクニックと説明は、困っている友達が集まって一緒に学ぶのに非常に役立ちます。

はじめに

正規表現の基本的な知識については説明しませんので、興味がある方はここをクリックしてください。 1 つは、単一位置の文字列を抽出する場合です。もう 1 つは、テキスト内の 1 つの位置の文字列を抽出することです。1 つは、複数の連続した位置の文字列を抽出することです。ログ分析ではこの状況が発生する可能性があり、それに対応する方法については以下で説明します。

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を追加した後にre.Sフラグとre.Mフラグを追加する必要があります。 S.改行文字と一致しますが、デフォルトでは改行文字と一致しません。

コードは次のとおりです:

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>…)这个正则表达式来提取。举例,如果我们有一行webserver的access日志:&#39;192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" "Mozilla/5.0"&#39;,我们想提取这行日志里面所有的内容,可以写多个(?P<name>expr)を使用して抽出でき、名前は指定したものに変更できます。その位置の文字列変数、exprを抽出位置の正規表現に変更できます。

コードは次のとおりです:

import re
line =&#39;192.168.0.1 25/Oct/2012:14:46:34 "GET /api HTTP/1.1" 200 44 "http://abc.com/search" 
"Mozilla/5.0"&#39;
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
ログイン後にコピー

出力結果は次のとおりです:

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 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート