"""
Test Regular Expressions
Written by Sunjay Varma -- www.sunjay.ca
"""
import sys, re, argparse, traceback as tb
__version__ = "1.0"
VALID_FLAGS = ['DOTALL', 'I', 'IGNORECASE', 'L', 'LOCALE', 'M', 'MULTILINE',
'S', 'T', 'TEMPLATE', 'U', 'UNICODE', 'VERBOSE', 'X']
FLAG_SEP = "|"
def parse_argv(argv):
parser = argparse.ArgumentParser(description="Test A Regular Expression \
Against Input", prog="Regular Expression Tester")
parser.add_argument('-f', nargs="?", type=argparse.FileType('r'),
default=None, help="The input file to use, if omitted, will use \
sys.stdin", dest="inputfile")
parser.add_argument('-p', nargs="?", type=argparse.FileType('r'),
default=None, help="The input regular expression as a text from a file",
dest="regfile")
parser.add_argument('pattern', type=str, help="The pattern to test",
default="", nargs="?")
parser.add_argument("-m", type=str, help="Flags to include in the regular \
expression. (e.g. VERBOSE|I)", dest="flags", default="")
parser.add_argument("-i", action="store_true", help="Run an input \
interpreter after reading the input file (if any). This happens automatically \
if there is no input file.", dest="after_input")
return parser.parse_args(argv)
def get_input(ifile):
try:
return ifile.readline()
except (EOFError, KeyboardInterrupt):
return None
def prompt(ifile=sys.stdin, prompt="> "):
try:
print prompt,
return ifile.readline()
except (EOFError, KeyboardInterrupt):
return None
def test_line(prog, line=""):
try:
result = prog.match(line)
if result:
print "\bHere is the result:"
for x in ["groups", "start", "end"]:
print x.capitalize()+"=>", getattr(result, x)()
print ""
return True
else:
print "No Matches!\n"
return False
except:
tb.print_exc()
print "\nAn error occurred!"
return False
def test_file(prog, input_file):
completed, total = 0, 0
line = get_input(input_file)
while line:
print "Testing '%s'"%line.rstrip()
completed += int(test_line(prog, line))
total += 1
line = get_input(input_file)
print "\nCompleted %i Successful Tests Out of %i"%(completed, total)
return completed, total
def main():
args = parse_argv(sys.argv[1:])
# retrieve the flags
flags = 0
for flag in (args.flags and args.flags.split(FLAG_SEP) or []):
if flag in VALID_FLAGS:
flags |= getattr(re, flag)
pat = args.pattern
if not pat and args.regfile:
pat = args.regfile.read()
try:
prog = re.compile(pat, flags)
except:
tb.print_exc()
print "\nInvalid Pattern"
sys.exit(0)
# test the pattern
print "Testing Pattern:",
if args.regfile:
print '\n"""\\\n'+pat, '"""\n'
else:
print repr(pat), "\n"
try:
if args.inputfile:
test_file(prog, args.inputfile)
args.inputfile.close()
if args.after_input or not args.inputfile:
if args.inputfile:
print "\nContinuing with Input Testing..."
completed, total = 0, 0
line = prompt()
while line:
completed += int(test_line(prog, line))
total += 1
line = prompt()
print "\nCompleted %i Successful Tests Out of %i"%(completed, total)
except KeyboardInterrupt:
raise SystemExit
if __name__ == "__main__":
main()
Diff to Previous Revision
--- revision 1 2010-12-24 23:45:30
+++ revision 2 2010-12-25 00:12:44
@@ -1,5 +1,3 @@
-#!/usr/bin/env python
-### re_t.py ###
"""
Test Regular Expressions
@@ -49,12 +47,13 @@
try:
result = prog.match(line)
if result:
- print "\bHere's the result:"
+ print "\bHere is the result:"
for x in ["groups", "start", "end"]:
print x.capitalize()+"=>", getattr(result, x)()
+ print ""
return True
else:
- print "No Matches!"
+ print "No Matches!\n"
return False
except:
tb.print_exc()