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がファイル名から格納されているのを忘れてた

今日はここまで