1. ホーム
  2. Web プログラミング
  3. 正規表現

Python正規表現ナニコレ式教え方詳細チュートリアル

2022-01-18 13:25:55

Pythonでは、クローラーがデータをクローリングして文字列を取得する場合など、文字列を扱うための実用的なツールとして正規表現がよく使われます。正規表現はPythonに組み込まれており、reモジュールをインポートすることで使用することができ、Python初心者の方は"regular"という言葉を聞いたことがある方が多いと思います。

本日は、正規表現を使いこなすための、より詳しいPython正規表現辞書をご紹介します。

I. リモジュール

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

1. re モジュールのインポート

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

インポートre 

2.findall()の構文。

reモジュールをインポートすると、findall()メソッドが使えるようになるので、findall()の構文がどのように指定されているかを明確にする必要があるのです。

findall(正規表現, 対象文字列)

findall()が正規表現とターゲット文字列で構成されていることは容易に理解できます。ターゲット文字列は取得したいもので、それを取得する方法は、今日の焦点である正規表現を通して操作することです。

findall()を使用した結果は、正規の条件に一致する文字列のリストです。

II. 正規表現

(i). 文字列のマッチング

1. 共通文字

ほとんどの文字と文字が単独でマッチング可能です。

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

出力結果です。

['abc']

2. メタ文字

メタキャラクタは、以下のものを指します。^ $ ? + {} \ をはじめとする特殊文字で、対象の文字列をパーソナライズして、欲しい結果を返すことができます。

ここでは、よく使われる10個のメタキャラクタとその使い方を紹介します。ここでは、覚えやすいように簡単にまとめてから、それぞれのメタ文字の使い方を一つずつ説明します。

<イグ

(1) []

の使い方は、大きく分けて3つあります。

は、文字セットを指定するためによく使われます。

s = "a123456b"
rule = "a[0-9][1-6][1-6][1-6][1-6][1-6][1-6]b" # here for the time being with this kind of trouble first, later there are easier, do not have to knock so much [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'] とする。

の中のメタ文字は動作せず、通常の文字のみ動作します。

例えば、文字列 "caabcabcaabc" から "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つが一般的です。

\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}は繰り返し書くことを避けることができ、例えば、3回 \w と書いたときに、on {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']

ここで、貪欲モードと非貪欲モードに注目してください。

Greedy mode: データをできるだけ多くマッチさせるために、 \d の後に meta character を追加します(例: \d*)。

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

出力します。

['010-123456789']

非欲求モード:できるだけ少ないデータでマッチングさせたい。

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, }は先ほどの*の効果と同等です

一般的なメタキャラクタとその使い方については以上ですが、残りの通常の知識について見ていきましょう。


(ii)レギュラーの使用

1. コンパイルして、正規の

Pythonでは、reモジュールはcompile()メソッド、re.compile(regular expression)を使って、例えば、次のようにコンパイルすることができます。

s = "010-123456789"
 rule = "010-\d*"
 rule_compile = re.compile(rule) # return an object
 # print(rule_compile)
 s_compile = rule_compile.findall(s)
 print(s_compile) # print what the object returned by compile() is

出力結果です。

['010-123456789']

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

通常のオブジェクトの使用は、我々が使用するために以前に導入されたfindall()を介してだけでなく、他のメソッドを介して、効果は同じではありませんが、ここで私は簡単な要約を行う。

(1) findall()
マッチする文字列を全て検索し、リストを返します。

(2) search()
文字列をスキャンして、この再一致を見つける(最初に調べたものだけ)。

(3) match()
reが文字列の先頭にあるかどうかを判定する(行頭のマッチング)

例として、上のcompile()が返したオブジェクトを、findall()の代わりにmatch()で見てみましょう。

s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule) # return an object
# print(rule_compile)
s_compile = rule_compile.match(s)
print(s_compile) # print what the object returned by compile() is

出力します。

結果は、添え字の位置0から13で始まり、010-123456789に一致するマッチオブジェクトであることがわかります。返されたオブジェクトはオブジェクトなので、このマッチオブジェクトのいくつかの操作について説明します。

3.オブジェクトの操作方法を一致させる

ここでは、まずメソッドを紹介し、後で例を挙げることにします。以下は、Matchオブジェクトの一般的な使用方法です。

(1) group()
再マッチの文字列を返す

(2) start()
マッチの開始位置を返す

(3) end()
マッチの終了位置を返す

(4) span()
タプルの位置を返します。(start,end)

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

s = "010-123456789"
rule = "010-\d*"
rule_compile = re.compile(rule) # return an object
s_compile = rule_compile.match(s)
print(s_compile.span()) # Use span() to process the returned object

その結果、次のようになります。

(0, 13)

4. reモジュールの機能

上記で紹介したfindall()関数以外にもreモジュールには関数があるので、それらを紹介しましょう。

(1) findall()
正規表現に基づきマッチしたすべての文字列を返します。これについては、先に説明したとおりなので、多くは語らない。

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

s = "abcabcacc" # original string
l = re.sub("abc","dddd",s) # string processed by sub()
print(l)

出力します。

ddddddacc #abcを全てdddに置き換える

(3)subn(regular,新しい文字列,元の文字列)
subn() の機能は、文字列を置換して、置換された数を返すことです。

s = "abcabcacc" # original string
l = re.subn("abc","dddd",s) # string processed by sub()
print(l)

出力します。

('bbbbbbbacc', 2)

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

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

出力結果です。

['a', 'ca', 'cacc'] とする。

規則性については以上です。規則性はPythonのほぼすべての方向性において必須の基礎となりますので、あなたのPythonの旅に幸あれ

Python正規表現乳母スタイル教育詳細チュートリアルに関するこの記事は、これに導入され、より関連するPython正規表現の内容は、スクリプトのホーム以前の記事を検索するか、次の関連記事を閲覧し続けてくださいあなたは、スクリプトのホームをよりサポートすることを願っています!この記事では、Pythonの正規表現を学ぶことができます。