Python学習ノート第2部-正規表現と爬虫類の小さな例(豆弁映画のスコアが8点以上の映画を捕まえる)

10903 ワード

一、正規表現
python正則でよく使われる関数と方法
compile(pattern,flags=0)は正規表現patternをコンパイルし、flagsはオプション識別子であり、regexオブジェクトを返します.
match(pattern,string,flags=0)は、正規表現モードpatternで文字列stringをマッチングしようとします.flagsはオプションの識別子で、マッチングに成功すると、マッチングオブジェクトを返します.そうでなければNoneに戻る
search(pattern,string[,flags])は文字列stringで正規表現モードpatternを検索する最初の出現であり、flagsはオプション識別子であり、一致に成功すると一致オブジェクトを返す.そうでなければNoneに戻る
findall(pattern,string[,flags])は、文字列stringで正規表現モードpatternのすべての(重複しない)出現を検索する.一致するオブジェクトのリストを返します
finditter(pattern,string[,flags])はfindall()と同じですが、リストではなく反復器が返されます.各一致について、反復器は一致するオブジェクトを返します.
split(pattern,string,max=0)正規表現patternの区切り文字に基づいて文字列stringをリストに区切り、一致に成功したリストを返します.最大max回区切ります(デフォルトは一致するすべての場所を区切ります).
sub(pattern,repl,string,max=0)は、文字列stringにおける正規表現patternに一致するすべての場所を文字列replに置き換え、maxの値が与えられていない場合は、すべての一致する場所を置き換える
group(num=0)は、すべての一致するオブジェクト(またはnumの番号を指定したサブグループ)を返します.
groups()は、すべての一致を含むサブグループのメタグループを返します(一致が成功しなければ、空のメタグループを返します).
==================================================================================
import re



m = re.match('foo','foo')   #match                    



 if m is not None:



        m.group()



# search()              :search                           , match(),  



m = re.search('foo','seafood') #    match()       ,  None



 if m is not None:m.group()    # search    
m = re.match('(\w\w\w)-(\d\d\d)','abc-123')

 m.group() #      

#'abc-123'

m.group(1)

#'abc'

m.group(2)

#'123'
m.groups() #
#('abc','123')
re.findall('car','carry the barcardi to the car')   #findall        

['car', 'car', 'car']
re.sub('X','Mr.Smith','attn:X

Dear X,
') # sub # 'attn:Mr.Smith

Dear Mr.Smith,
'
re.subn('X','Mr.Smith','attn:X

Dear X,
') #subn , #('attn:Mr.Smith

Dear Mr.Smith,
', 2)

python小さな爬虫類-私の最初の例
#! /usr/bin/env python

# coding=utf-8 ##

#             8    #

#http://movie.douban.com/tag/%E5%8A%A8%E4%BD%9C?start=0&type=T

import urllib2

import re

import sys



#           

type = sys.getfilesystemencoding()

j = 0

for i in range(0, 5000, 20):

    url = 'http://movie.douban.com/tag/%E5%8A%A8%E4%BD%9C?'

    hash = 'start=%d&type=T' % i

    url = url + hash

    print(url)

    #   url  

    content = urllib2.urlopen(url).read()

    #     

    content = content.decode("UTF-8").encode(type)

    #       

    match = re.findall(r'<div\s+class="pl2"><a.+?>(.+?)/\s*<span.+?<\/a>', content)

    #     

    match2 = re.findall(r'<span\s+class="rating_nums">([0-9.]+)<\/span>', content)

    #        

    zipc = zip(match, match2)

    #     

    f = open('douban.txt', 'a')

    #     

    for name in zipc:

        #  8    

        if float(name[1])>=8:

            f.write(name[0])

            f.write(name[1])

            f.write('
') j = j + 1 print name[0] print j print (' '+ str(j) +' ').decode("UTF-8").encode(type) print 'done' f.close()

得られた結果は大体以下の通りである.
ハリケーン救出8.1バットマン:ダークナイト台頭8.4皿中諜4 8.1諜影重さ8.3諜影重さ8.6バットマン:ダークナイト9.4速度と情熱5 8.8ハッカー帝国8.3 V字仇殺隊8.7復讐者連盟8.7007:大戦ロイヤルカジノ8.0変顔8.3生化学危機5:罰8.3敢死隊8.9007:大破量子危機8.4英雄本色8.6十月囲城8.1指名手配令9.2デスカー8.4ハッカー帝国3:マトリックス革命8.2無間道8.7空中刑務所8.0カリブ海賊8.4救出されたカンゴ8.5アヴァンダ8.7弾丸を8.8新龍門宿屋8.3縦横四海8.6ソース8.3 X戦警:第一戦8.0鉄甲鋼拳8.1トランスフォーマー8.0格闘クラブ9.1虎胆龍威8.1角闘士8.2