当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 2 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : 正则表达式测试[python][gtk]
帖子发表于 : 2009-05-10 11:28 

注册: 2006-08-22 23:10
帖子: 166
送出感谢: 0 次
接收感谢: 0 次
代码:
#!/usr/bin/env python
#coding:utf-8
import gtk
global option
option = 0
class main_window(gtk.Window):
    def __init__(self, parent=None):
        gtk.Window.__init__(self)
        try:
            self.set_screen(parent.get_screen())
        except AttributeError:
            self.connect('destroy', lambda *w: gtk.main_quit())

        self.set_title(self.__class__.__name__)
        self.set_border_width(10)
        self.set_default_size(600,400)

        h = gtk.HBox(); h.set_border_width(5)
        label = gtk.Label("请输入url地址:")
        h.pack_start( label, expand=False)
        e = gtk.Entry()
        self.url = e
        h.add( e)
        b = gtk.Button('刷新')
        b.connect('clicked', self.get_url)
        h.pack_start( b, expand=False)

        b = gtk.Button('选择一个文件')
        b.connect('clicked', self.get_file)
        h.pack_start( b, expand=False)


        v = gtk.VBox(); v.set_border_width(5)
        v.pack_start( h, expand= False)

        f = gtk.Frame('txt')
        self.f = f
        print dir( f)
        t , sw = self.get_textview()
       
        tmp = gtk.VBox()
        tmp.add( sw)
        h = gtk.HBox(); h.set_border_width(5)

        b = gtk.Button('下一个')
        b. connect( 'clicked', self.move_next, False)
        self.next= b
        h.pack_end( b, expand=False)

        b = gtk.Button('上一个')
        b. connect( 'clicked', self.move_next, True)
        self.pre= b
        h.pack_end( b, expand=False)

        e = gtk.Entry()
        e. connect( 'changed', self.search_text)
        h.pack_end( e, expand=False)

        label = gtk.Label("查找:")
        self.label = label
        h.pack_end( label, expand=False)

        tmp.pack_start( h, False)
        f.add( tmp)

        v.pack_start( f)
        self.textview = t
        b = t.get_buffer()
        self.find_tag = b.create_tag( foreground="red")
        self.now_tag = b.create_tag( foreground="red",background="green")

        print b.insert(b.get_iter_at_offset(0),'text!')
        b.insert(b.get_end_iter(),'2text!')
        for i in range(20):b.insert(b.get_end_iter(),'\n2text!')
        #print dir(b)
        b.insert_at_cursor('kdjf')


        #print dir(s)
        print b.get_text(b.get_start_iter(),b.get_end_iter())
        print b.get_line_count()
        b.delete(b.get_start_iter(),b.get_end_iter())
        self.txt = b


        h = gtk.HBox(); h.set_border_width(5)
        label = gtk.Label("请输入out = re.findall(r'%s',txt,option)中的正则表达式,将代入%s位置:")
        h.pack_start( label, expand=False)
        e = gtk.Entry()
        self.retxt = e
        h.add( e)
        b = gtk.Button('确定')
        b.connect('clicked', self.get_out)
        h.pack_start( b, expand=False)
        v.pack_start( h, expand=False)

        h = gtk.HBox(); h.set_border_width(5)
        c = gtk.CheckButton(label=None)
        c.set_label('re.IGNORECASE')
        c.connect("toggled", self.option)
        h.pack_end( c, expand=False)

        c = gtk.CheckButton(label=None)
        c.set_label('re.DOTALL')
        c.connect("toggled", self.option)
        h.pack_end( c, expand=False)

        c = gtk.CheckButton(label=None)
        c.set_label('re.M')
        c.connect("toggled", self.option)
        h.pack_end( c, expand=False)
        label = gtk.Label("其它参数option:")
        h.pack_end( label, expand=False)

        v.pack_start( h, expand=False)

        f = gtk.Frame('输出结果')
        t , sw = self.get_textview()
        f.add( sw)
        v.add( f)
        self.out = t.get_buffer()

        self.add( v)
        self.show_all()
        test = self.decode( u'你'.encode('utf8'))
        print test, isinstance( test, unicode)
    def search_text(self, w, *data):
        print w.get_text()
        self.rlist = self. search( self.textview, w.get_text(), self.find_tag)
        if self.rlist:self.label.set_text('查找:('+str( len(self.rlist))+ ')')
        else:self.label.set_text('查找:')
        self.now = 0
        self.scrollto( self.textview, self.rlist, self.now, self.now_tag)
    def move_next(self, w, data):
        print w, data, self.now
        if data:
            self.now -=1
        else:
            self.now +=1
        if self.now< 0: self.now = len( self.rlist)-1
        if self.now> len( self.rlist)-1: self.now = 0

        self.scrollto( self.textview, self.rlist, self.now, self.now_tag)

    def search(self, textview, text, find_tag):
        b = textview.get_buffer()
        start, end = b.get_bounds()
        b.remove_tag( find_tag, start, end)

        #iter = b.get_iter_at_mark(b.get_insert())
        iter = b.get_iter_at_offset(0)
        find_list = []
        if not text:
            return find_list
        while 1:
            res = iter.forward_search( text,gtk.TEXT_SEARCH_VISIBLE_ONLY|gtk.TEXT_SEARCH_TEXT_ONLY)
            if not res: break
            match_start, match_end = res
            find_list.append( res)
            #iter.backward_search('kd',gtk.TEXT_SEARCH_VISIBLE_ONLY|gtk.TEXT_SEARCH_TEXT_ONLY)
            b.apply_tag( find_tag, match_start, match_end)
            iter = match_end
        return find_list

    def scrollto(self, textview, find_list, index, now_tag):
        b = textview.get_buffer()
        start, end = b.get_bounds()
        b.remove_tag( now_tag, start, end)
        if find_list and index in range( len( find_list)):
            start, end = find_list[index]
            b.apply_tag( now_tag, start, end)
            mark = b.create_mark(None, start, False)
            textview.scroll_to_mark(mark, 0, True, 0.0, 1.0)
            b.delete_mark(mark)

    def option(self, w, *data):
        print w, w.get_label(), w.get_active()
        global option
        import re
        if w.get_active():
            if  w.get_label()== 're.M':
                option = option + re.M
            elif  w.get_label()== 're.IGNORECASE':
                option = option + re.IGNORECASE
            elif  w.get_label()== 're.DOTALL':
                option = option + re.DOTALL
        else:
            if  w.get_label()== 're.M':
                option = option - re.M
            elif  w.get_label()== 're.IGNORECASE':
                option = option - re.IGNORECASE
            elif  w.get_label()== 're.DOTALL':
                option = option - re.DOTALL
        print option

    def decode(self, text, code=['utf8','gbk','gb2312']):
        out = ''
        for i in code:
            try:out = text.decode( i)
            except:pass
            else: break
        return out=='' and text or out

    def get_file(self, data):
        print data
        f = gtk.FileChooserDialog( title=None,action=gtk.FILE_CHOOSER_ACTION_OPEN,buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK))
        r = f.run()
        if r == gtk.RESPONSE_OK:
            print f.get_filename(),f.get_current_folder()
            self.txt.delete( self.txt.get_start_iter(),self.txt.get_end_iter())
            out = open( f.get_filename()).read()
            out = self.decode( out)
            self.txt.insert_at_cursor( out )
            self.f.set_label( 'txt 来自文件:'+f.get_filename())
        f.destroy()

    def get_url(self, data):
        url = self.url.get_text()
        if not url:
            return
        print url
        import urllib2, re
        t = urllib2.urlopen( url)
        out= t.read()
        #code = re.findall(r'text/html;\s*charset=\s*([^\ \'\"]*)',out) or re.findall(r'text/html;\s*charset=\s*([^\ \'\"]*)',t.headers.get('content-type'))
        #print t.headers.get('content-type')
        #print code
        #if code:out = out.decode( code[0])
        #print t.headers
        out = self.decode( out)

        if out:
            self.txt.delete( self.txt.get_start_iter(),self.txt.get_end_iter())
            self.txt.insert_at_cursor( out)
            self.f.set_label( 'txt 来自url:'+url[:60]+ (len(url)>60 and '...' or '') )
    def get_out(self, data):
        txt = self.txt.get_text(self.txt.get_start_iter(),self.txt.get_end_iter())

        import re
        global option
        out = re.findall(r'%s'% self.retxt.get_text(),txt, option)

        self.out.delete( self.out.get_start_iter(),self.out.get_end_iter())
        self.out.insert_at_cursor( 'str(out):\n')
        self.out.insert_at_cursor( str(out))
        self.out.insert_at_cursor( '\n\nlen(out):\n')
        self.out.insert_at_cursor( str(len(out)))
        self.out.insert_at_cursor( '\n\n\'\\n\\n\'.join(out):[注:经过处理,如果是同时抓取多个则每行结果用一个换行分开,不同行用两个换行分开。]\n')
        if out and isinstance( out[0] , tuple):
            out = ['\n'.join(i) for i in out]
        self.out.insert_at_cursor( '\n\n'.join(out))

    def get_textview(self):
        sw = gtk.ScrolledWindow()
        sw.set_shadow_type(gtk.SHADOW_ETCHED_IN)
        sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)

        t = gtk.TextView()
        t.set_wrap_mode(gtk.WRAP_CHAR)#自动换行,按字符 gtk.WRAP_CHAR.real==1
        sw.add( t)
        return t, sw

def main():
    main_window()
    gtk.main()

if __name__ == '__main__':
    main()


大家看看


附件:
Screenshot-main_window.png
Screenshot-main_window.png [ 13.74 KiB | 被浏览 815 次 ]

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 正则表达式测试[python][gtk]
帖子发表于 : 2009-05-10 18:17 

注册: 2008-11-13 16:03
帖子: 817
送出感谢: 0 次
接收感谢: 0 次
这个要顶的,正则表达式太不同一了,学起来估计有点麻烦


_________________
HP ProBook4321s,I3+ATI
OS : Fedora + Debian

http://box-look.org/


页首
 用户资料  
 
显示帖子 :  排序  
发表新帖 回复这个主题  [ 2 篇帖子 ] 

当前时区为 UTC + 8 小时


在线用户

正在浏览此版面的用户:没有注册用户 和 1 位游客


不能 在这个版面发表主题
不能 在这个版面回复主题
不能 在这个版面编辑帖子
不能 在这个版面删除帖子
不能 在这个版面提交附件

前往 :  
本站点为公益性站点,用于推广开源自由软件,由 DiaHosting VPSBudgetVM VPS 提供服务。
我们认为:软件应可免费取得,软件工具在各种语言环境下皆可使用,且不会有任何功能上的差异;
人们应有定制和修改软件的自由,且方式不受限制,只要他们自认为合适。

Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
简体中文语系由 王笑宇 翻译