Pythonを学ぶ その6
正規表現
文字列の頭が数字?
re.match('\d+',text)
re.serch('^\d+',text)
re.match()
は先頭からマッチするものを
re.serch()
はどこでもマッチするものを確認する
マッチしなければNone
が返される
マッチしていたらマッチ型が返される
マッチしているものに対して行える操作がある
m.group()
m.start()
m.end()
m.span()
...
こういう関数はNoneオブジェクトに対して使用するとエラーが返されるので、一般的に
if m: マッチした時の処理 else: ...
という風に
マッチする文字列の部分抽出
数値を抜き出す
re.match(~~~~~,text)
~~~の部分でどういう風にデータを構造化するか、そして()で抽出する要素を指定する
findall()
で全部取得
ちなみに少し気になったけど、リストでなく配列という言葉を使っている箇所がある。なぜ?
コンパイル
regex = re.compile(~~)
とすることで
regex.match(text)
というように、正規表現を書かずに済む
演習
import re i = re.findall('([A-z]+)\W', 'I have 2 pens.') print(i)
日本語を扱う
文字を表現するにはバイナリを文字コードに従って変換する必要がある。 文字を扱う場合はファイル内で使用する文字コードは統一すること。
使うときは
# config:utf-8
日本語を扱うには、unicode文字列型として使う。 文字列の先頭にuをつけてあげればいい
文字列への変換text.encode('shift-jis')
unicode文字列への変換text.decode('shift-jis')
pythonで日本語のテキストファイルの読み書き
import codecs f = codecs.open('utf-8.txt','r','utf-8') for line in f: print(type(line)) print(line) f.close()
取得してくるとunicode文字列型に成ってる
演習1
import math def tentwo(x): x = float(x) i = int(math.log(x,2)) print(i) if(i == 0): return 0 else: y = [] print(type(y)) while(x != 0): if((x < pow(2,i)) == True): print('0notoki'+ str(x) + '.' + str(pow(2,i)) ) y.append("0") x = x i = i - 1 print(y) else: print(str(x) + '.' + str(pow(2,i)) ) y.append("1") x = x - pow(2,i) i = i - 1 print(y) y = "".join(y) return int(y) #print('enter an intger') #x = raw_input() x = 35 print('x =' + str(tentwo(x)))
なぜかjoinがうまく使えなくてコマった
演習3
# coding: utf-8 text = u'今日はいい天気ですね。おはようございます。ハロー' n = text.split(u'。') for line in n: print(line)
リストとしてやるとダメなんやね
つまり
print(n)
でやると、ちゃんと出てこない
演習4
import sys import codecs name = sys.argv[1] fcodec = sys.argv[2] wr = sys.argv[3] f_in = codecs.open(name,'r',fcodec) f_out = codecs.open(name+'.'+fcodec+'.txt','w',wr) for line in f_in: f_out.write(line) f_in.close() f_out.close()
sys.argv
がファイル名から格納されているのを忘れてた
今日はここまで