2022年4月9日土曜日

Wordle(6)

 Wordle(5)からの続き   

Wordleを解くための支援プログラムを次のようなものとする。「5文字単語のデータベースを用意して,ワイルドカードを含む与えられた候補にマッチする単語を全て選び出して表示する」。perlでプログラムを組みたいところだったが,pythonの練習をすることにした。

5文字単語データベースとしては,前回示した WikiText-103 word Level からwords.shで処理したものを用いる。その後は,久々の python プログラミングなので,よちよち歩きながら試行錯誤する。

(1) コマンドラインの引数は,sysモジュールをimportすれば,sys.argv[n]でアクセスできる。sys.argv[0]はpythonスクリプト名,sys.argv[1] 以下で複数の引数を受け渡す。
(2) ファイルのオープンとクローズの方法は記載の通り。第1引数は先に求めてある5文字単語データファイル名である。
(3) テキストファイルを1行づつ分割して読み込むには,datalist=f.readlines() などとするとその結果のリストが 得られる。
(4) perlのようにdatalistから1行づつ取り出して処理をするのが,for data in datalist: である。
(5) 正規表現によるマッチングには,re モジュールをimportしたうえで,re.search(r'正規表現' , 原データ) という形式による。これが Noneでなければマッチしていることになる。
(6) 第2引数で入力する5文字のワイルドカードをピリオド(. )にしておけばそのまま正規表現として使えてるので便利である。
(7) データファイルは,wc -l で生成しているので,頭に頻度を表した数桁の数字が空白を区切りに付加されているため,'\d* '+arg としている。文字列の結合には,プラス(+)演算子を用いる。
(8) print文で余分の改行を削除するには,end="" をつければよい。
# usage: word.py w.txt a.b.c
import sys
import re

f = open(sys.argv[1], 'r')
datalist = f.readlines()
arg = sys.argv[2]

for data in datalist:
# print(arg, data, re.search(r'\d* '+arg, data))
  if(re.search(r'\d* '+arg, data) != None):
    print(data, end="")

f.close()

0 件のコメント: