Python、はじめました

非IT系私文卒リーマン vs Python の全記録

Python SoloLearn Regular Expressions①

f:id:pokita:20181013095615p:plain

まずはこちらをご覧ください。

import re

source = '''I wish I may, I wish I might
....Have a dish of fish tonight'''

m = re.search(r'(?P<DISH>. dish\b).*(?P<FISH>\bfish)', source)
print(m.group())

>>>a dish of fish

なんか気持ち悪くない?
一見して何を書いているのかわからない緑色の文字列。
これが正規表現という記述らしいが……

 

正規と呼ぶにはあまりにも非正規では

 

今回はそんな正規表現について違和感ないくらいに、一見で理解できるようになることが目標となっています。

 

 

Regular Expressions

エスケープシーケンス

To avoid any confusion while working with regular expressions, we would use raw strings as r"expression".
Raw strings don't escape anything, which makes use of regular expressions easier.

 

escapeするというのは、
””で囲まれた文字列が、文字そのものを意味するのではなく、
文字色の変更やカーソルの移動、文字の消去など、
文字出力の制御を行う特殊な文字列として作用する、
ということ。

 

この機能がある文字列をエスケープシーケンスと呼ぶ。

 

以下がその主な一覧です。 

文字 説明
¥'  シングルコーテーション
¥" ダブルコーテーション 
¥t タブ
¥¥ バックスラッシュ
¥n 改行 (LF)
¥r 復帰 (CR)
¥0 Null文字
¥f 改ページ
¥ooo oooにはASCII文字の8進数3桁のコードが入ります
→ASCII文字が表示されます
¥xhh hhにはASCII文字の16進数2桁のコードが入ります
→ASCII文字が表示されます
¥uxxxx xxxxにはUnicodeの16進数4桁のコードが入ります
Unicodeの文字が表示されます

 文字列を表す""の先頭にrを付けることで、
このエスケープシーケンスの働きを無効化することができる。

pattern = r"first\nsecond"
pattern2 ="first\nsecond"

print(pattern)

>>>first\nsecond

print(pattern2)

>>>first
second

 

match関数

The re.match function can be used to determine whether it matches at the beginning of a string

 

match関数は引数を二つ持ち、第一引数をパターン、第二引数をソースと呼ぶ。
ソースの先頭がパターンになっているかどうかをチェックし、
なっていればmatchオブジェクト(←何?)を、なければNoneを戻す。

import re

pattern =
r"spam"
source = "spamspamspam"

if re.match(pattern, source):
print("Match")
else:
print("No match")

>>>Match

パターンspamはソースspamspamspamの先頭と完全一致なので、
re.match(pattern, source)はmatchオブジェクト(True)(何?)を戻す。

matchオブジェクト

import re

pattern = r"spam"

print(re.match(pattern, "spamspamspam"))

>>><_sre.SRE_Match object; span=(0, 4), match='spam'>

一致があった際、match関数で戻されるのはmatchオブジェクトである。
ちなみに、search関数も同様である。

import re

pattern = r"spam"

print(re.search(pattern, "egghamspamspamspamham"))

>>><_sre.SRE_Match object; span=(6, 10), match='spam'>

The regex(Regular Expression) search returns an object with several methods that give details about it.

 

matchオブジェクトの戻り値は上記のような内容であるため、
当然ながらこれだけでは使いようがない。
matchオブジェクトのメソッドで調理することで、はじめて使える形になる。

メソッドはオブジェクト内蔵のものだからreを改めて使う必要はないよ

import re

pattern = r"spam"

a = re.search(pattern, "egghamspamspamspamham")

print(a.group())

>>>spam

print(a.start())

>>>6

print(a.end())

>>>10

print(a.span())

>>>(6,10)

 

今回はここまで