+++ /dev/null
-"""Basic regular expression demostration facility (Perl style syntax)."""\r
-\r
-from Tkinter import *\r
-import re\r
-\r
-class ReDemo:\r
-\r
- def __init__(self, master):\r
- self.master = master\r
-\r
- self.promptdisplay = Label(self.master, anchor=W,\r
- text="Enter a Perl-style regular expression:")\r
- self.promptdisplay.pack(side=TOP, fill=X)\r
-\r
- self.regexdisplay = Entry(self.master)\r
- self.regexdisplay.pack(fill=X)\r
- self.regexdisplay.focus_set()\r
-\r
- self.addoptions()\r
-\r
- self.statusdisplay = Label(self.master, text="", anchor=W)\r
- self.statusdisplay.pack(side=TOP, fill=X)\r
-\r
- self.labeldisplay = Label(self.master, anchor=W,\r
- text="Enter a string to search:")\r
- self.labeldisplay.pack(fill=X)\r
- self.labeldisplay.pack(fill=X)\r
-\r
- self.showframe = Frame(master)\r
- self.showframe.pack(fill=X, anchor=W)\r
-\r
- self.showvar = StringVar(master)\r
- self.showvar.set("first")\r
-\r
- self.showfirstradio = Radiobutton(self.showframe,\r
- text="Highlight first match",\r
- variable=self.showvar,\r
- value="first",\r
- command=self.recompile)\r
- self.showfirstradio.pack(side=LEFT)\r
-\r
- self.showallradio = Radiobutton(self.showframe,\r
- text="Highlight all matches",\r
- variable=self.showvar,\r
- value="all",\r
- command=self.recompile)\r
- self.showallradio.pack(side=LEFT)\r
-\r
- self.stringdisplay = Text(self.master, width=60, height=4)\r
- self.stringdisplay.pack(fill=BOTH, expand=1)\r
- self.stringdisplay.tag_configure("hit", background="yellow")\r
-\r
- self.grouplabel = Label(self.master, text="Groups:", anchor=W)\r
- self.grouplabel.pack(fill=X)\r
-\r
- self.grouplist = Listbox(self.master)\r
- self.grouplist.pack(expand=1, fill=BOTH)\r
-\r
- self.regexdisplay.bind('<Key>', self.recompile)\r
- self.stringdisplay.bind('<Key>', self.reevaluate)\r
-\r
- self.compiled = None\r
- self.recompile()\r
-\r
- btags = self.regexdisplay.bindtags()\r
- self.regexdisplay.bindtags(btags[1:] + btags[:1])\r
-\r
- btags = self.stringdisplay.bindtags()\r
- self.stringdisplay.bindtags(btags[1:] + btags[:1])\r
-\r
- def addoptions(self):\r
- self.frames = []\r
- self.boxes = []\r
- self.vars = []\r
- for name in ('IGNORECASE',\r
- 'LOCALE',\r
- 'MULTILINE',\r
- 'DOTALL',\r
- 'VERBOSE'):\r
- if len(self.boxes) % 3 == 0:\r
- frame = Frame(self.master)\r
- frame.pack(fill=X)\r
- self.frames.append(frame)\r
- val = getattr(re, name)\r
- var = IntVar()\r
- box = Checkbutton(frame,\r
- variable=var, text=name,\r
- offvalue=0, onvalue=val,\r
- command=self.recompile)\r
- box.pack(side=LEFT)\r
- self.boxes.append(box)\r
- self.vars.append(var)\r
-\r
- def getflags(self):\r
- flags = 0\r
- for var in self.vars:\r
- flags = flags | var.get()\r
- flags = flags\r
- return flags\r
-\r
- def recompile(self, event=None):\r
- try:\r
- self.compiled = re.compile(self.regexdisplay.get(),\r
- self.getflags())\r
- bg = self.promptdisplay['background']\r
- self.statusdisplay.config(text="", background=bg)\r
- except re.error, msg:\r
- self.compiled = None\r
- self.statusdisplay.config(\r
- text="re.error: %s" % str(msg),\r
- background="red")\r
- self.reevaluate()\r
-\r
- def reevaluate(self, event=None):\r
- try:\r
- self.stringdisplay.tag_remove("hit", "1.0", END)\r
- except TclError:\r
- pass\r
- try:\r
- self.stringdisplay.tag_remove("hit0", "1.0", END)\r
- except TclError:\r
- pass\r
- self.grouplist.delete(0, END)\r
- if not self.compiled:\r
- return\r
- self.stringdisplay.tag_configure("hit", background="yellow")\r
- self.stringdisplay.tag_configure("hit0", background="orange")\r
- text = self.stringdisplay.get("1.0", END)\r
- last = 0\r
- nmatches = 0\r
- while last <= len(text):\r
- m = self.compiled.search(text, last)\r
- if m is None:\r
- break\r
- first, last = m.span()\r
- if last == first:\r
- last = first+1\r
- tag = "hit0"\r
- else:\r
- tag = "hit"\r
- pfirst = "1.0 + %d chars" % first\r
- plast = "1.0 + %d chars" % last\r
- self.stringdisplay.tag_add(tag, pfirst, plast)\r
- if nmatches == 0:\r
- self.stringdisplay.yview_pickplace(pfirst)\r
- groups = list(m.groups())\r
- groups.insert(0, m.group())\r
- for i in range(len(groups)):\r
- g = "%2d: %r" % (i, groups[i])\r
- self.grouplist.insert(END, g)\r
- nmatches = nmatches + 1\r
- if self.showvar.get() == "first":\r
- break\r
-\r
- if nmatches == 0:\r
- self.statusdisplay.config(text="(no match)",\r
- background="yellow")\r
- else:\r
- self.statusdisplay.config(text="")\r
-\r
-\r
-# Main function, run when invoked as a stand-alone Python program.\r
-\r
-def main():\r
- root = Tk()\r
- demo = ReDemo(root)\r
- root.protocol('WM_DELETE_WINDOW', root.quit)\r
- root.mainloop()\r
-\r
-if __name__ == '__main__':\r
- main()\r