当前时区为 UTC + 8 小时



发表新帖 回复这个主题  [ 7 篇帖子 ] 
作者 内容
1 楼 
 文章标题 : [原创]验证正则表达式是否匹配的脚本程序, GUI界面
帖子发表于 : 2009-10-21 18:02 
头像

注册: 2009-04-03 20:52
帖子: 101
地址: Guangzhou -China
送出感谢: 0 次
接收感谢: 0 次
Usage:
代码:
python rv.py

Screenshot:
附件:
screenshot.png
screenshot.png [ 52.81 KiB | 被浏览 531 次 ]


代码:
#!/usr/bin/env python
#
# file: rv.py
# A program to show regex matches in time, using pygtk.
# Tony CHEN, South China University of Technology, <chwentong@gmail.com>
# Looking for a job related with python program, can you help me?
#

import pygtk
import gtk
import re
pygtk.require('2.0')

class MatchTextView(gtk.TextView):
    def __init__(self):
        gtk.TextView.__init__(self)
   
    def mark_match_text(self, pattern):
        buffer = self.get_buffer()
        buffer.remove_all_tags(buffer.get_start_iter(),
                               buffer.get_end_iter())
        matchTag = buffer.create_tag(None, background='yellow')

        def match_case(match):
            s, e = match.span()
            startIter = buffer.get_iter_at_offset(s)
            stopIter = buffer.get_iter_at_offset(e)
            buffer.apply_tag(matchTag, startIter, stopIter)

        pattern.sub(match_case, buffer.get_text(buffer.get_start_iter(),
                                                buffer.get_end_iter()))

class RV:
    def select_file(self, widget):
        '''File Chooser Handler function'''
        fileSel = gtk.FileChooserDialog('Select a file for input text',
                                        None,
                                        gtk.FILE_CHOOSER_ACTION_OPEN,
                                        (gtk.STOCK_OPEN, gtk.RESPONSE_OK,
                                         gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL))
        r = fileSel.run()
        if r == gtk.RESPONSE_OK:
            fileName = fileSel.get_filename()
            buffer = self.textView.get_buffer()
            buffer.set_text(open(fileName).read())
        fileSel.destroy()
       
    def refresh(self, widget):
        '''Refresh display handler function'''
        pattern = self.regexEntry.get_text()
        flags = 0
        for (check, v) in self.checkList:
            if check.get_active():
                flags = flags | v
        pattern = re.compile(pattern, flags)
        self.textView.mark_match_text(pattern)
       
    def clear_text(self, widget):
        '''Clear match text view'''
        buffer = self.textView.get_buffer()
        buffer.set_text('')
       
    def demo(self, w):
        '''Demo handler'''
        try:
            import rvtest
        except ImportError:
            self.textView.get_buffer().set_text('Import rvtest error! \nNeed file "rvtest.py" for this demo!')
            return
        self.textView.get_buffer().set_text(rvtest.testText)
        self.regexEntry.set_text(rvtest.testRegex)
        for (check, v) in self.checkList:
            if v == re.MULTILINE:
                check.set_active(True)
            elif v == re.DOTALL:
                check.set_active(True)
            elif v == re.VERBOSE:
                check.set_active(True)
        pattern = re.compile(self.regexEntry.get_text(),
                             re.MULTILINE | re.DOTALL | re.VERBOSE)
        self.textView.mark_match_text(pattern)
       
    def __init__(self):
        ###################################################################
        # Main window
        ###################################################################
        self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
        self.window.connect('destroy', lambda w: gtk.main_quit())
        self.window.set_title("Regex View 1.0")
        self.window.set_border_width(5)
        self.window.set_resizable(False)
        vbox = gtk.VBox(False, 5)
        hbox = gtk.HBox(False, 5)
        self.window.add(hbox)
       
        ###################################################################
        # Regex Entry Frame
        ###################################################################
        regexFrame = gtk.Frame('Regex Entry')
        self.regexEntry = gtk.Entry()
        self.regexEntry.connect('activate', self.refresh)
        regexFrame.add(self.regexEntry)
       
        ###################################################################
        # Match Text View Frame
        ###################################################################
        textFrame = gtk.Frame('Match Text View')
        scrollWindow = gtk.ScrolledWindow()
        scrollWindow.set_size_request(500, 400)
        scrollWindow.set_border_width(5)
        scrollWindow.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
        self.textView = MatchTextView()
        self.textView.set_wrap_mode(gtk.WRAP_WORD_CHAR)
       
        scrollWindow.add(self.textView)
        textFrame.add(scrollWindow)
       
        ###################################################################
        # Left VBox group
        ###################################################################
        label = gtk.Label('Note: Not support unicode chars!')
        vbox.pack_start(regexFrame, False, False, 0)
        vbox.pack_start(textFrame, False, False, 0)
        vbox.pack_start(label, False, False, 0)
        hbox.pack_start(vbox, False, False, 0)
       
        ###################################################################
        # Regex Flags Frame
        ###################################################################
        vbox = gtk.VBox(False, 5)
        vbox.set_border_width(2)
        checkboxFrame = gtk.Frame('Regex Flags')
        checkboxFrame.add(vbox)
        self.checkList = []
       
        check = gtk.CheckButton('DOTALL')
        check.set_tooltip_text('Make . match any character, including newlines.')
        vbox.pack_start(check, False, False, 0)
        check.connect('toggled', self.refresh)
        self.checkList.append((check, 16))
       
        check = gtk.CheckButton('MULTILINE')
        check.set_tooltip_text('Multi-line matching, affecting ^ and $.')
        vbox.pack_start(check, False, False, 0)
        check.connect('toggled', self.refresh)
        self.checkList.append((check, 8))
       
        check = gtk.CheckButton('VERBOSE')
        check.set_tooltip_text('Enable verbose REs, which can be organized more cleanly and understandably.')
        vbox.pack_start(check, False, False, 0)
        check.connect('toggled', self.refresh)
        self.checkList.append((check, 64))
       
        check = gtk.CheckButton('IGNORECASE')
        check.set_tooltip_text('Do case-insensitive matches.')
        vbox.pack_start(check, False, False, 0)
        check.connect('toggled', self.refresh)
        self.checkList.append((check, 2))
       
        check = gtk.CheckButton('LOCALE')
        check.set_tooltip_text('Do a locale-aware match.')
        vbox.pack_start(check, False, False, 0)
        check.connect('toggled', self.refresh)
        self.checkList.append((check, 4))

        check = gtk.CheckButton('UNICODE')
        check.set_tooltip_text('Makes several escapes like \w, \b, \s and \d dependent on the Unicode character database.')
        vbox.pack_start(check, False, False, 0)
        check.set_inconsistent(True)
        self.checkList.append((check, 32))
       
        ###################################################################
        # Button group
        ###################################################################
        openFileButton = gtk.Button('_Open File')
        openFileButton.connect('clicked', self.select_file)
       
        refreshButton = gtk.Button('_Refresh')
        refreshButton.connect('clicked', self.refresh)
       
        clearButton = gtk.Button('_Clear Text')
        clearButton.connect('clicked', self.clear_text)
       
        demoButton = gtk.Button('_Demo')
        demoButton.connect('clicked', self.demo)
       
        exitButton = gtk.Button('E_xit')
        exitButton.connect('clicked', gtk.main_quit)
        ###################################################################
        # Right VBox group
        ###################################################################       
        vbox = gtk.VBox()
        vbox.pack_start(checkboxFrame, False, False, 0)
        vbox.pack_start(openFileButton, False, False, 5)
        vbox.pack_start(refreshButton, False, False, 2)
        vbox.pack_start(clearButton, False, False, 2)
        vbox.pack_start(demoButton, False, False, 2)
        vbox.pack_end(exitButton, False, False, 0)
        hbox.pack_start(vbox)
       
        self.window.show_all()
       
if __name__ == '__main__':
    app = RV()
    gtk.main()
       

代码:
#
# file: rvtest.py
# Tony CHEN, South China University of Technology, <chwentong@gmail.com>
#

testText = '''
/*
 * sortm.h
 *
 *  Created on: 22 Sep 2009
 *      Author: tony
 */

#ifndef SORTM_H_
#define SORTM_H_
namespace sortm { // Begin namespace sortm

typedef void (*SORTM)(int [], int);

void swap(int &, int &);
void t_sort(SORTM sortm);

void inssort(int d[], int n);        // Insertion sorting algorithm
void bubsort(int d[], int n);        // Bubble sorting algorithm
void selsort(int d[], int n);        // Selection sorting algorithm

} // End namespace sortm

#endif /* SORTM_H_ */
'''
testRegex = '(/\*.*?\*/) | (//.*?$)'


_________________
There should be one-- and preferably only one --obvious way to do it.


最后由 tonychen123 编辑于 2009-10-21 21:02,总共编辑了 1 次

页首
 用户资料  
 
2 楼 
 文章标题 : Re: 验证正则表达式是否匹配的脚本程序, GUI界面
帖子发表于 : 2009-10-21 20:59 
头像

注册: 2009-04-03 20:52
帖子: 101
地址: Guangzhou -China
送出感谢: 0 次
接收感谢: 0 次
这是我花了一天时间边学边做出来的,方便不熟悉正则表达式的朋友们学习测试之用。
感觉pygtk构造GUI界面确实很方便,很适合做前期模型的开发。


_________________
There should be one-- and preferably only one --obvious way to do it.


页首
 用户资料  
 
3 楼 
 文章标题 : Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面
帖子发表于 : 2009-10-21 21:25 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
记得有练习reg的软件的哦。估计是perl的。正宗些。
写gui界面,其实都方便。


_________________
● 鸣学


页首
 用户资料  
 
4 楼 
 文章标题 : Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面
帖子发表于 : 2009-10-22 1:24 
头像

注册: 2007-12-25 12:51
帖子: 231
送出感谢: 0 次
接收感谢: 0 次
要是能加上各种语言、各种程序、是否使用扩展之类的开关选项,楼主就功德无量了,毕竟不同场合用起来还是有区别的。


页首
 用户资料  
 
5 楼 
 文章标题 : Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面
帖子发表于 : 2009-10-22 9:07 
头像

注册: 2009-04-03 20:52
帖子: 101
地址: Guangzhou -China
送出感谢: 0 次
接收感谢: 0 次
我做的这个是特别针对python语言中的re模块的,已经把扩展上的开关选项都连上了。
由于gtk.TextView模块与re模块的对unicode字符的支持好像各不相同,所以暂时无法支持中文,我也正在想解决的办法。


_________________
There should be one-- and preferably only one --obvious way to do it.


页首
 用户资料  
 
6 楼 
 文章标题 : Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面
帖子发表于 : 2009-10-22 9:19 
头像

注册: 2009-04-03 20:52
帖子: 101
地址: Guangzhou -China
送出感谢: 0 次
接收感谢: 0 次
tonychen123 写道:
我做的这个是特别针对python语言中的re模块的,已经把扩展上的开关选项都连上了。
由于gtk.TextView模块与re模块的对unicode字符的支持好像各不相同,所以暂时无法支持中文,我也正在想解决的办法。

问题是这样的,如果有下面语句:
代码:
中文abc

gtk.TextView会把中文统计为两个字节,所以abc位置为(3,6),而re模块中使用MatchObject.span()时,会统计为四个字节,所以abc位置为(5,8)


_________________
There should be one-- and preferably only one --obvious way to do it.


页首
 用户资料  
 
7 楼 
 文章标题 : Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面
帖子发表于 : 2009-10-22 9:23 
头像

注册: 2005-08-14 21:55
帖子: 58428
地址: 长沙
送出感谢: 4
接收感谢: 272
p kiki - tool for python regular expression testing
p kodos - A visual regular expression editor


_________________
● 鸣学


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

当前时区为 UTC + 8 小时


在线用户

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


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

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

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