正規表現は、データ(フォーマット)の検証、文字コンテンツの置換、文字列コンテンツの抽出などのプログラム開発でよく使用されますが、現在、多くの開発者は正規表現しか理解していないか、基本的に知っています。中古ステージ。通常の表現(Webクローラーなど)の大規模な使用に遭遇すると、基本的に盲目であると言えます。この記事では、Pythonを使用した正規表現について学習します。基本的にすべての言語が同様の方法で正規表現を使用するため、この記事を読む前に、Pythonの基本を習得するか、他の開発言語の基本的な知識を持っている必要があります。
構文 | 説明 | 例 | 一致する文字列 |
---|---|---|---|
. | 改行 "\ n" | ab | acb、adb、a2b、a〜b |
| エスケープして、転送された文字の後に文字の元の意味を変更する | a [b \。\] c | abc、ac、a \ c | |
[] | 括弧内の任意の文字に一致 | a [b、c、d、e] f | abd、acf、adf、aef |
[^] | 括弧内の文字を除いて、他のすべての文字は | a [^ a、b、c、d、e] f | a1f、a#f、azf、agf |
構文 | 説明 | 例 | 一致する文字列 |
---|---|---|---|
^ | 開始する文字列 | ^ 123 | 123abc、123321、123zxc |
$ | どの文字列で終わるか | 123 $ | abc123、321123、zxc123 |
\ b | 文字ではなく、単語の境界に一致する | \ basd \ b | asd |
\ d | 一致番号0-9 | zx \ dc | zx1c、zx2c、zx5c |
\ D | 非数字に一致 | zx \ Dc | zxvc、zx $ c、zx&c |
\ s | 空白文字に一致 | zx \ sc | zx c |
\ S | 空白以外の文字と一致する | zx \ Sc | zxac、zx1c、zxtc |
\ w | 文字、数字、下線を一致させる | zx \ wc | zxdc、zx1c、zx_c |
\ W | 文字以外、数字、下線に一致 | zx \ Wc | zx c、zx $ c、zx(c |
事前定義された文字には、次の点に注意する必要があります。
構文 | 説明 | 例 | 一致する文字列 |
---|---|---|---|
* | 0を何度も一致させる | zxc * | zx、zxccccc |
+ | 1を何度も一致させる | zxc + | zxc、zxccccc |
? | 0回または1回一致 | zxc? | zxc、zx |
{ m} | m回一致 | zxc {3} vb | zxcccvb |
{ m、} | m回以上一致 | zxc {3、} vb | zxcccvb、zxccccccccvb |
{, n} | 0からn回一致 | zxc {、3} vb | zxvb、zxcvb、zxccvb、zxcccvb |
{ m、n} | mをn回一致させる | zxc {1,3} | zxcvb、zxccvb、zxcccvb |
文法 | 説明 |
---|---|
*? | 0回以上一致しますが、繰り返しはできるだけ少なくします |
+? | 1回以上一致しますが、繰り返しはできるだけ少なくします |
?? | 0または1に一致しますが、繰り返しはできるだけ少なくします |
{ m、}? | m回以上一致しますが、繰り返しはできるだけ少なくします |
{ m、n}? | m回またはn回一致しますが、繰り返しはできるだけ少なくします |
Pythonでの正規式の使用は非常に簡単で、** re **モジュールは正規式のサポートを提供します。使用する3つのステップがあります:
Pythonで一般的に使用されるreメソッドは、*** compile 、 match 、 search 、 findall ***、**の6つです。 * split と sub ***、以下はこれらの6つの方法を説明します。
マッチングモード | 説明 |
---|---|
re.I | ケースを無視 |
re.M | マルチラインマッチングモード |
re.S | 任意のマッチングモード |
re.L | 事前定義された文字マッチングモード |
re.U | 限定文字マッチングモード |
re.V | 詳細モード |
上記の6つのモードは、実際の開発ではめったに使用されません。理解する必要があります。コンパイルの使用は、次のように非常に簡単です。
import re
pattern = re.compile(r'\d')
import re
def getMatch(message):
pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{0,1})')
match = re.match(pattern, message)if match:print(match.groups())for item in match.groups():print(item)else:print("一致しませんでした")if __name__ =='__main__':
message ="会議は2019年1月23日に始まります"getMatch(message)
message ="2019年の会議-01-23開催"getMatch(message)
コードでは、一致する文字列グループを取得するために使用される*** groups ***メソッドを使用します。ここに到着した後、多くの読者は、なぜ最初の段落が年、月、日と一致するのか疑問に思うでしょうが、2番目の段落は一致しないのですか?これは、matchメソッドが文字列の先頭から一致するためです。コード操作の結果は次のとおりです。
import re
def getMatch(message):
pattern = re.compile(r'(\d{4}[-年])(\d{2}[-月])(\d{2}日{0,1})')
match = re.search(pattern, message)if match:print(match.groups())for item in match.groups():print(item)else:print("一致しませんでした")if __name__ =='__main__':
message ="会議は2019年1月23日に始まります"getMatch(message)
message ="2019年の会議-01-23開催"getMatch(message)
上記のコード操作の結果は次のとおりです。
[ 外部リンクの画像転送に失敗しました。ソースサイトにリーチ防止リンクメカニズムがある可能性があります。画像を保存して直接アップロードすることをお勧めします(img-VmTrXNxa-1575984679614)(https://s2.ax1x.com/2019/12/03/QQ8fR1.png) ]
4. findall
findallメソッドの機能は、文字列全体を照合し、照合したすべての結果をリストの形式で返すことです。
import re
def getMatch(message):
pattern = re.compile(r'\w+')
match = re.findall(pattern, message)if match:print(match)else:print("一致しませんでした")if __name__ =='__main__':
message ="私の名前は張さんです"getMatch(message)
message ="張さんは私です"getMatch(message)
コード実行結果は次のとおりです。
import re
def getMatch(message):
pattern = re.compile(r'-')
match = re.split(pattern, message)if match:print(match)else:print("一致しませんでした")if __name__ =='__main__':
message ="2018-9-12"getMatch(message)
message ="最初の一歩-第二段階-3番目のステップ-4番目のステップ-and more"getMatch(message)
上記のコード操作の結果は次のとおりです。
import re
def getMatch(match):return match.group(0).replace(r'年齢','age')if __name__ =='__main__':
message ="あなたの年齢?"
pattern=re.compile(r'\w+')print(re.sub(pattern,getMatch,message))
コード実行結果は次のとおりです。
Pythonの正規式は非常に便利です。上記のコードは直接コピーして、わずかな変更を加えてプロジェクトで使用できます。内容はあまり多くありませんが、主にコードの使い方を説明するために、常連式の書き方を十分に理解し、習得していただきたいと思います。
Recommended Posts