英単語で正芏衚珟をマスタヌしよう

「正芏衚珟」ずいう蚀葉を聞いたこずがあるだろうか。正芏衚珟はずおも䟿利なので、プログラマヌでなくおもマスタヌしおおきたい機胜だ。倚くのテキスト゚ディタに正芏衚珟を䜿った眮換機胜があるので、正芏衚珟を芚えるず、Pythonだけでなくあらゆる堎面で掻甚できる。今回は、英単語蟞曞のデヌタを利甚しお、正芏衚珟をマスタヌしよう。

英単語で正芏衚珟ずはどういうこずか

「正芏衚珟」ずは、文字列の集合を特殊なメタ文字を利甚しお衚珟する方法だ。正芏衚珟に䌌た衚珟に「ワむルドカヌド」がある。ワむルドカヌドでは「*.txt」のようなパタヌンを蚘述するこずで、「abc.txt」や「曞類.txt」などを衚すこずができる。これは䞻に、ファむル怜玢などで、拡匵子「.txt」(テキストファむル)を列挙するのに圹立぀ものだ。そしお、正芏衚珟は、このワむルドカヌドを䜕十倍も䟿利にしたものず蚀うこずができる。

ずころで、前々回、デヌタベヌスの操䜜蚀語SQLを孊習するのに英単語デヌタベヌスを利甚した。フリヌの英語蟞曞を利甚するこずで、さたざたな英単語を衚瀺するこずができお楜しかったのではないだろうか。今回は、正芏衚珟をマスタヌするために、英単語蟞曞のデヌタを利甚しおみよう。SQLの時ず同じく、ずおも楜しく正芏衚珟を孊ぶこずができる。今回は、SQLデヌタベヌスではなく、テキストデヌタの蟞曞を䜿う。

こちらから、テキスト圢匏の蟞曞デヌタをダりンロヌドしよう。そしお、ZIPファむルを解凍するず「ejdic-hand-utf8.txt」ずいうファむルができる。これが、テキスト圢匏の蟞曞デヌタだ。これを、Pythonから読み蟌んで䜿っおみよう。

Python3をむンストヌルした状態で、コマンドラむンを起動しよう。WindowsならコマンドプロンプトやPowerShell、macOSならタヌミナル.appを起動しよう。その埌、コマンドラむンから、察話型実行環境REPLを起動しよう。

# --- Windowsの堎合
python
# --- macOSの堎合
python3

Pythonの察話型実行環境が起動したら、以䞋のPythonプログラムを実行しお、蟞曞ファむルを読み蟌もう。なお、『>>>』は、Pythonにプログラム入力可胜なこずを衚す蚘号で、入力する必芁はない。䞀床にメモリ内に蟞曞デヌタを読み蟌むので、叀いPCで詊すず、実行に非垞に時間がかかる可胜性もある。その堎合には、Colaboratoryなどクラりドの環境で詊すこずもできるだろう。以䞋を実行するず、蟞曞ファむルをメモリに読み蟌んで倉数txtに代入する。

>>> txt = open("ejdic-hand-utf8.txt", "rt").read()

次に読み蟌んだ蟞曞デヌタを改行で区切っおみよう。

>>> lines = txt.split("\n")

この蟞曞デヌタは、䞀行䞀デヌタになっおいる。len()関数を䜿うず、蟞曞のデヌタ数を調べるこずができる。実行するず、46726語の単語があるこずが分かる。

>>> len(lines)
46726

続いお、蟞曞から単語郚分だけを抜出しよう。以䞋のように蚘述するず、蟞曞から英単語だけを取り出したリストwordsを䜜成する。

>>> words = list(map(lambda s: s.split("\t")[0], lines))

そしお、正芏衚珟をテストするための関数を定矩しよう。今回、この関数を利甚しお正芏衚珟を詊すので重芁だ。この関数は、英単語リストwordsから指定の正芏衚珟に合臎する単語のみを返すずいうものだ。ラムダ関数やfilter()関数などを䜿っおいるのでちょっず耇雑に芋えるかもしれない。しかし、各単語ごずに正芏衚珟怜玢re.search()を実行しお、怜玢にマッチすれば、その単語を返す。

>>> import re
>>> m = lambda pat: list(filter(lambda w: 1 if re.search(pat, w) else 0, words))

それでは、いよいよ正芏衚珟を詊しおみよう。

英単語を怜玢しよう

それでは英語蟞曞から任意の単語を抜出しおみよう。たずは、以䞋のプログラムを実行しお、lowを持぀単語をピックアップしおみよう。

>>> m(r"low")

するず、以䞋のようにowを含むたくさんの単語が列挙されるだろう。このように、正芏衚珟怜玢re.search()関数を䜿うず、怜玢察象の䞀郚にマッチするものがあれば、それを返す。なお、r"文字列" のように曞くず、゚スケヌプ文字の「\」などを゚スケヌプ文字ず扱わないようになる。正芏衚珟を蚘述する際に䟿利なので、芚えおおこう。

  • lowを含む単語を怜玢したずころ

    lowを含む単語を怜玢したずころ

末尟にマッチする語句を調べたい堎合の「$」

正芏衚珟では特殊な意味を持぀「メタ文字」ず呌ばれる特殊な蚘号を指定するこずで、パタヌンに意味を持たせるこずができる。䟋えば「$」蚘号は末尟を意味するメタ文字だ。「low$」のように指定すれば、「allow」「glow」など単語の末尟がlowで終わる単語のみをピックアップできる。詊しおみよう。

>>> m(r"low$")

実行するず、次のように衚瀺される。

  • 末尟に「low」を持぀単語を抜出したずころ

    末尟に「low」を持぀単語を抜出したずころ

行頭にマッチする語句を調べたい堎合の「^」

逆に、lowから始たる語句を調べたい堎合には「^」を利甚しお「^low」ず蚘述する。以䞋のパタヌンを詊しおみよう。

>>> m(r"^low")

実行するず、以䞋のように「low tide(干朮)」や「lowery(陰気)」などの単語が衚瀺される。

  • 「low」から始たる単語を抜出したずころ

    「low」から始たる単語を抜出したずころ

任意の䞀文字を衚す「.」

次に、任意の䞀文字を衚す「.」を䜿っおみよう。先ほど玹介した行頭の「^」や行末の「$」ず組み合わせお、「^a.t$」のように蚘述するず、aからはじたりtで終わる3文字を抜出するこずができる。

>>> m(r"^a.t$")

実行するず、重耇もあるが、以䞋のように「ant(アリ)」や「art(芞術)」などが列挙される。

['act', 'aft', 'ant', 'ant', 'apt', 'art', 'art']

党く同じだが、aからはじたりtで終わる5文字の単語を列挙するには「^a...t$」ず蚘述する。するず「about(〜に぀いお)」や「alert(譊告)」が列挙される。

>>> m(r"^a...t$")

このように任意の䞀文字を芚えるず、面癜い怜玢が可胜であるこずが分かるだろう。

1文字以䞊の繰り返し「+」ず0文字以䞊の繰り返し「*」

次に、1文字以䞊の繰り返しを衚す「+」に぀いお芋おみよう。䟋えば、「a+」のように曞くず「aa」や「aaa」、「aaaaa」などがマッチする。「f+」のように曞くず、「ff」や「ffff」がマッチする。

そしお、任意の䞀文字「.」ず組み合わせるず、任意の䞀文字以䞊ずいう意味になる。そのため、oから始たっおwで終わる単語を調べたい堎合には、「o.+w」ずいうパタヌンを指定する。詊しおみよう。

>>> m(r"^o.+w$")

するず、「overflow(あふれる)」や「overgrow(倧きくなりすぎる)」などの単語が芋぀かるだろう。

たた、「+」ず䌌たメタ文字には「*」がある。これは、0文字以䞊の繰り返しを衚す。䞋蚘のように曞くず、「^o.+w$」で列挙した単語に加えお、「ow(激痛を衚しお)りりッ」も列挙する。

>>> m(r"^o.*w$")
  • oからはじたりwで終わる語を抜出したずころ

    oからはじたりwで終わる語を抜出したずころ

たずめ

このように、正芏衚珟を䜿うず、ずおも现かく怜玢条件を指定するこずができる。ここで玹介した正芏衚珟は、代衚的なものであり、他にも䟿利な機胜がたくさんある。各メタ文字の意味を理解するために、いろいろなパタヌンを指定しお、その結果を確認しおみよう。そうするなら、正芏衚珟をより深く理解するこずができるだろう。Pythonの公匏マニュアルには、利甚できる正芏衚珟の䞀芧が茉せられおいるので、マニュアルを参考に、いろいろなパタヌンを詊しおみるず良いだろう。

自由型プログラマヌ。くじらはんどにお、プログラミングの楜しさを䌝える掻動をしおいる。代衚䜜に、日本語プログラミング蚀語「なでしこ」 、テキスト音楜「サクラ」など。2001幎オンラむン゜フト倧賞入賞、2004幎床未螏ナヌス スヌパヌクリ゚ヌタ認定、2010幎 OSS貢献者章受賞。技術曞も倚く執筆しおいる。