はじめに
正規表現の基本的な知識については説明しませんので、興味がある方はここをクリックしてください。 1 つは、一般に 2 つのケースです。もう 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>…)
正規表現を使用して抽出できます。たとえば、Web サーバーのアクセス ログの行:
'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 を抽出位置の正規表現に変更できます。コードは次のとおりですこの記事は誰にとっても役立ちます。質問がある場合は、メッセージを残して連絡してください。
以上がPythonで正規表現を使って文字列を抽出する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。