Pythonの正規表現を詳しく解説 ナニー流の教え方 〇基礎も正規表現をマスターできる

文字列を処理するための実用的なツールとして、Python では正規化がよく使用されます。たとえば、データをクロールする場合、正規化は文字列の取得などによく使用されます。正規表現はすでに Python に組み込まれており、re モジュールをインポートすることで使用できます. Python を学習したばかりの初心者にとって、ほとんどの人は「正規」という言葉を聞いたことがあるでしょう.

今日は、より詳細な Python の正規表現のコレクションを紹介したいと思います.学習後、正規表現に習熟することができます.

ここに画像の説明を挿入


1. 再モジュール

正規表現について話す前に、まず正規表現がどこで使用されているかを知る必要があります。正規表現は findall() メソッドで使用され、ほとんどの文字列検索は findall() で実行できます。

1. re モジュールのインポート
正規表現を使用する前に、re モジュールをインポートする必要があります。

import re	

2. findall() の構文:

re モジュールをインポートした後、findall() メソッドを使用できるようになるため、findall() の構文がどのように指定されているかを知っておく必要があります。

findall(正则表达式,目标字符串)

findall() が正規表現と対象文字列で構成されていることは容易に理解できますが、取得したいのは対象文字列なので、取得方法を正規表現で操作するのが今日の焦点です。

findall() を使用した後に返される結果はリストであり、リストは通常​​の要件を満たす文字列です


2、正規表現

(1) 文字列マッチング

1.普通のキャラクター

ほとんどの文字と文字が一致します。

import re
a = "abc123+-*"
b = re.findall('abc',a)
print(b)

出力結果:

['abc']

2. メタキャラクター

メタ文字とは、. ^ $ ? + {} \ [] などの特殊文字を指し、これを介してターゲット文字列のパーソナライズされた検索を実行し、必要な結果を返すことができます。

ここでは、一般的に使用される 10 のメタ文字とその使用方法を紹介します. ここでは、覚えやすいように簡単にまとめます. 以下に、各メタ文字の使用法を 1 つずつ説明します.

ここに画像の説明を挿入

(1) []

[] を使用するには、主に 3 つの方法があります。

  • 通常、文字セットを指定するために使用されます。
s = "a123456b"
rule = "a[0-9][1-6][1-6][1-6][1-6][1-6]b"	#这里暂时先用这种麻烦点的方法,后面有更容易的,不用敲这么多[1-6]
l = re.findall(rule,s)
print(l)

出力は次のとおりです。

['a123456b']
  • 範囲を表すことができます。

たとえば、文字列「abcabcaccaac」で abc 要素を選択するには、次のようにします。

s = "abcabcaccaac"
rule = "a[a,b,c]c"  # rule = "a[a-z0-9][a-z0-9][a-z0-9][a-z0-9]c"	
l = re.findall(rule, s)
print(l)

出力は次のとおりです。

['abc', 'abc', 'acc', 'aac']
  • [] 内のメタ文字は効果がなく、通常の文字のみです。

たとえば、文字列 "caa bcabcaabc"から "caa" を選択するには:

print(re.findall("caa[a,^]", "caa^bcabcaabc"))

出力は次のとおりです。

['caa^']

注: [] の最初の位置にある場合は、a 以外のすべてが一致することを意味します。たとえば、 [] 内の a の位置を変更します。

print(re.findall("caa[^,a]", "caa^bcabcaabc")) 

出力:

['caa^', 'caab'] 

(2)^

^ は通常、行頭に一致させるために使用されます。次に例を示します。

print(re.findall("^abca", "abcabcabc"))

出力結果:

['abca']

写真の説明を追加してください

(3) $
$ は通常、行末に一致させるために使用されます。たとえば、次のようになります。

print(re.findall("abc$", "accabcabc"))

出力結果:

['abc']

ここに画像の説明を挿入

(4) \

バックスラッシュの後にさまざまな特別な意味を示すためにさまざまな文字を追加できます。次の 3 つが一般的です。

  • \d: [0-9] に相当する任意の 10 進数に一致します。
print(re.findall("c\d\d\da", "abc123abc"))

出力は次のとおりです。

['c123a']

\ は通常の文字にエスケープできます。例:

print(re.findall("\^abc", "^abc^abc"))

出力結果:

['^abc', '^abc']
  • s

任意の空白文字に一致します。例:

print(re.findall("\s\s", "a     c"))

出力結果:

['  ', '  ']
  • \w

[a-zA-Z0-9_] に相当する任意の英数字とアンダースコアに一致します。例:

print(re.findall("\w\w\w", "abc12_"))

出力:

['abc', '12_']

ここに画像の説明を挿入

(5){n}

{n} は繰り返し書くことを避けることができます. たとえば, 以前 \w を使ったときは \w を 3 回書いたのですが, ここでは {n} を使う必要があります. n は一致した数を示します.

print(re.findall("\w{2}", "abc12_"))

出力結果:

['ab', 'c1', '2_']

(6) *

* は、0 回以上一致することを意味します (可能な限り一致する)。たとえば、次のようになります。

print(re.findall("010-\d*", "010-123456789"))

出力:

['010-123456789']

**(7) + **

+ は 1 回以上一致することを意味します。

print(re.findall("010-\d+", "010-123456789"))

出力:

['010-123456789']

(8) .

. はドットです。ここでは明らかではありませんが、改行以外の任意の文字を操作するために使用されます。たとえば、次のようになります。

print(re.findall(".", "010\n?!"))

出力:

['0', '1', '0', '?', '!']

(9) ?

? 1回または0回一致することを意味します

print(re.findall("010-\d?", "010-123456789"))

出力:

['010-1']

ここで、貪欲モードと非貪欲モードに注意する必要があります。

貪欲モード: できるだけ多くのデータに一致し、\d の後に \d* などのメタ文字が続く形式で表されます。

print(re.findall("010-\d*", "010-123456789"))

出力:

['010-123456789']

非貪欲モード: \d の後に ? が続く形式で表される、できるだけ少ないデータに一致します。、\d?

print(re.findall("010-\d*?", "010-123456789"))

出力は次のとおりです。

['010-']

(10){m,n}
m,n は 10 進数を指します。つまり、少なくとも m 回、最大で n 回繰り返すことを意味します。たとえば、次のようになります。

print(re.findall("010-\d{3,5}", "010-123456789"))

出力:

['010-12345']

プラス?できるだけ一致しないことを示します

print(re.findall("010-\d{3,5}?", "010-123456789"))

出力:

['010-123']

{m,n} には、次のような柔軟な書き方があります。

  • {1,} は上記の + の効果に相当します
  • {0, 1} は前述の ? 効果
  • {0,} は上記の * の効果に相当します

ここに画像の説明を挿入

ここでは、一般的に使用されるメタ文字とその使用方法について最初に説明し、次にその他の日常的な知識を見てみましょう。


(2) レギュラーの使用

1. 通常のコンパイル

Python では、re モジュールは compile() メソッドを介して正規表現をコンパイルできます。

 s = "010-123456789"
 rule = "010-\d*"
 rule_compile = re.compile(rule) #返回一个对象
 # print(rule_compile)
 s_compile = rule_compile.findall(s)
 print(s_compile)	#打印compile()返回的对象是什么

出力結果:

['010-123456789']

2. 通常のオブジェクトの使用方法

通常のオブジェクトの使用は、先ほど紹介した findall() だけでなく、他の方法でも使用できます. 効果は異なります. ここで簡単に要約します.

(1) findall() は、
re に一致するすべての文字列を検索し、リストを返します

(2) search() は
文字列をスキャンして、この re の一致する位置を見つけます (最初に見つかったもののみ)

(3) match() は
re が文字列の先頭にあるかどうかを判定します (行の先頭に一致します)。

上記の compile() によって規則性をコンパイルした後に返されるオブジェクトを例に取ります. ここでは findall() を使用しませんが、 match() を使用して結果を確認します:

s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule)  # 返回一个对象
# print(rule_compile)
s_compile = rule_compile.match(s)
print(s_compile)  # 打印compile()返回的对象是什么

出力:

<re.Match object; span=(0, 13), match='010-123456789'>

結果は一致オブジェクトで、開始添字の位置は 0 ~ 13 で、一致は 010-123456789 であることがわかります。オブジェクトが返されたので、match オブジェクトのいくつかの操作方法について説明しましょう。

ここに画像の説明を挿入


3. Match オブジェクトの操作方法

まずメソッドを紹介し、後で例を示します.Match オブジェクトの一般的な使用方法は次のとおりです。

(1) group() は
re に一致する文字列を返します

(2) start() は
試合開始位置を返す

(3) end() は
試合終了位置を返す

(4) span()
はタプルを返します: (開始, 終了) 位置

例: span() を使用して、search() によって返されたオブジェクトを操作します。

s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule)  # 返回一个对象
s_compile = rule_compile.match(s)
print(s_compile.span())  #用span()处理返回的对象

結果は次のとおりです。

(0, 13)

4. re モジュールの機能

上記で紹介した findall() 関数に加えて、紹介する re モジュールには他の関数があります。

(1) findall() は、
正規表現に従って、一致したすべての文字列を返します。

(2) sub(通常、新しい文字列、元の文字列)
sub() 関数の機能は、文字列を置き換えることです。たとえば、次のようになります。

s = "abcabcacc" #原字符串
l = re.sub("abc","ddd",s)   #通过sub()处理过的字符串
print(l)

出力:

ddddddacc	#把abc全部替换成ddd

(3) subn (通常、新しい文字列、元の文字列)
subn() の機能は、文字列を置換し、置換数を返すことです

s = "abcabcacc" #原字符串
l = re.subn("abc","ddd",s)   #通过sub()处理过的字符串
print(l)

出力:

('ddddddacc', 2)

(4) split()
split() は文字列を分割します。例:

s = "abcabcacc"
l = re.split("b",s)
print(l)

出力結果:

['a', 'ca', 'cacc']

ここに画像の説明を挿入


3. 結論

正則化については以上です. 正則性は Python のほぼすべての方向で不可欠な基盤です. Python の旅の成功を祈っています!

読んで気に入ってくれてありがとう. 私はたくさんの技術的な乾物を集めました, 私の記事が好きな友達と共有することができます. 落ち着いて学ぶために時間を割いても構わないと思っているなら, 彼らは間違いなくあなたを助けます.乾物には以下が含まれます:

ここに画像の説明を挿入

記事の最後にある名刺をクリックして取り出します
ここに画像の説明を挿入

おすすめ

転載: blog.csdn.net/zhiguigu/article/details/130483778