[原创]验证正则表达式是否匹配的脚本程序, GUI界面

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
tonychen123
帖子: 101
注册时间: 2009-04-03 20:52
来自: Guangzhou -China

[原创]验证正则表达式是否匹配的脚本程序, GUI界面

#1

帖子 tonychen123 » 2009-10-21 18:02

Usage:

代码: 全选

python rv.py
Screenshot:
screenshot.png

代码: 全选

#!/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 = '(/\*.*?\*/) | (//.*?$)'
上次由 tonychen123 在 2009-10-21 21:02,总共编辑 1 次。
There should be one-- and preferably only one --obvious way to do it.
头像
tonychen123
帖子: 101
注册时间: 2009-04-03 20:52
来自: Guangzhou -China

Re: 验证正则表达式是否匹配的脚本程序, GUI界面

#2

帖子 tonychen123 » 2009-10-21 20:59

这是我花了一天时间边学边做出来的,方便不熟悉正则表达式的朋友们学习测试之用。
感觉pygtk构造GUI界面确实很方便,很适合做前期模型的开发。
There should be one-- and preferably only one --obvious way to do it.
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面

#3

帖子 eexpress » 2009-10-21 21:25

记得有练习reg的软件的哦。估计是perl的。正宗些。
写gui界面,其实都方便。
● 鸣学
头像
c\nc
帖子: 231
注册时间: 2007-12-25 12:51

Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面

#4

帖子 c\nc » 2009-10-22 1:24

要是能加上各种语言、各种程序、是否使用扩展之类的开关选项,楼主就功德无量了,毕竟不同场合用起来还是有区别的。
头像
tonychen123
帖子: 101
注册时间: 2009-04-03 20:52
来自: Guangzhou -China

Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面

#5

帖子 tonychen123 » 2009-10-22 9:07

我做的这个是特别针对python语言中的re模块的,已经把扩展上的开关选项都连上了。
由于gtk.TextView模块与re模块的对unicode字符的支持好像各不相同,所以暂时无法支持中文,我也正在想解决的办法。
There should be one-- and preferably only one --obvious way to do it.
头像
tonychen123
帖子: 101
注册时间: 2009-04-03 20:52
来自: Guangzhou -China

Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面

#6

帖子 tonychen123 » 2009-10-22 9:19

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.
头像
eexpress
帖子: 58428
注册时间: 2005-08-14 21:55
来自: 长沙

Re: [原创]验证正则表达式是否匹配的脚本程序, GUI界面

#7

帖子 eexpress » 2009-10-22 9:23

p kiki - tool for python regular expression testing
p kodos - A visual regular expression editor
● 鸣学
回复