diff --git a/Lib/fmt.py b/Lib/fmt.py
index f7c2718..3f146cb 100644
--- a/Lib/fmt.py
+++ b/Lib/fmt.py
@@ -461,9 +461,9 @@
 		self.paralist[para2].invert(d, pos1, pos2)
 	#
 	def search(self, prog):
-		import regex, string
+		import re, string
 		if type(prog) == type(''):
-			prog = regex.compile(string.lower(prog))
+			prog = re.compile(string.lower(prog))
 		if self.selection:
 			iold = self.selection[0][0]
 		else:
@@ -474,8 +474,9 @@
 				continue
 			p = self.paralist[i]
 			text = string.lower(p.extract())
-			if prog.search(text) >= 0:
-				a, b = prog.regs[0]
+			match = prog.search(text)
+			if match:
+				a, b = match.group(0)
 				long1 = i, a
 				long2 = i, b
 				hit = long1, long2
diff --git a/Lib/fnmatch.py b/Lib/fnmatch.py
index 9b31856..ed81594 100644
--- a/Lib/fnmatch.py
+++ b/Lib/fnmatch.py
@@ -10,6 +10,8 @@
 corresponding to PATTERN.  (It does not compile it.)
 """
 
+import re
+
 _cache = {}
 
 def fnmatch(name, pat):
@@ -42,11 +44,8 @@
 	
 	if not _cache.has_key(pat):
 		res = translate(pat)
-		import regex
-		save_syntax = regex.set_syntax(0)
-		_cache[pat] = regex.compile(res)
-		save_syntax = regex.set_syntax(save_syntax)
-	return _cache[pat].match(name) == len(name)
+		_cache[pat] = re.compile(res)
+	return _cache[pat].match(name) is not None
 
 def translate(pat):
 	"""Translate a shell PATTERN to a regular expression.
@@ -85,8 +84,6 @@
 						stuff = stuff[1:] + stuff[0]
 					stuff = '[' + stuff + ']'
 				res = res + stuff
-		elif c in '\\.+^$':
-			res = res + ('\\' + c)
 		else:
-			res = res + c
-	return res
+			res = res + re.escape(c)
+	return res + "$"
diff --git a/Lib/fpformat.py b/Lib/fpformat.py
index 4574575..404738d 100644
--- a/Lib/fpformat.py
+++ b/Lib/fpformat.py
@@ -11,11 +11,11 @@
 # digits_behind: number of digits behind the decimal point
 
 
-import regex
+import re
 
 # Compiled regular expression to "decode" a number
-decoder = regex.compile( \
-	'^\([-+]?\)0*\([0-9]*\)\(\(\.[0-9]*\)?\)\(\([eE][-+]?[0-9]+\)?\)$')
+decoder = re.compile( \
+	'^([-+]?)0*([0-9]*)((\.[0-9]*)?)(([eE][-+]?[0-9]+)?)$')
 # \0 the whole thing
 # \1 leading sign or empty
 # \2 digits left of decimal point
@@ -30,10 +30,9 @@
 # fraction is 0 or more digits
 # expo is an integer
 def extract(s):
-	if decoder.match(s) < 0: raise NotANumber
-	(a1, b1), (a2, b2), (a3, b3), (a4, b4), (a5, b5) = decoder.regs[1:6]
-	sign, intpart, fraction, exppart = \
-		s[a1:b1], s[a2:b2], s[a3:b3], s[a5:b5]
+	m = decoder.match(s)
+	if not m: raise NotANumber
+	sign, intpart, fraction, exppart = m.group(1, 2, 3, 5)
 	if sign == '+': sign = ''
 	if fraction: fraction = fraction[1:]
 	if exppart: expo = eval(exppart[1:])
diff --git a/Lib/glob.py b/Lib/glob.py
index 990ffa3..599d41b5 100644
--- a/Lib/glob.py
+++ b/Lib/glob.py
@@ -2,7 +2,7 @@
 
 import os
 import fnmatch
-import regex
+import re
 
 
 def glob(pathname):
@@ -50,7 +50,7 @@
 	return result
 
 
-magic_check = regex.compile('[*?[]')
+magic_check = re.compile('[*?[]')
 
 def has_magic(s):
-	return magic_check.search(s) >= 0
+	return magic_check.search(s) is not None
diff --git a/Lib/keyword.py b/Lib/keyword.py
index 2ad80d7..ba9249d 100755
--- a/Lib/keyword.py
+++ b/Lib/keyword.py
@@ -7,10 +7,7 @@
 #  To update the symbols in this file, 'cd' to the top directory of
 #  the python source tree after building the interpreter and run:
 #
-#    PYTHONPATH=./Lib ./python Lib/keyword.py
-#
-#  (this path allows the import of string.py and regexmodule.so
-#  for a site with no installation in place)
+#    python Lib/keyword.py
 
 kwlist = [
 #--start keywords--
@@ -52,7 +49,7 @@
 iskeyword = kwdict.has_key
 
 def main():
-    import sys, regex, string
+    import sys, re, string
 
     args = sys.argv[1:]
     iptfile = args and args[0] or "Python/graminit.c"
@@ -61,13 +58,15 @@
 
     # scan the source file for keywords
     fp = open(iptfile)
-    strprog = regex.compile('"\([^"]+\)"')
+    strprog = re.compile('"([^"]+)"')
     lines = []
     while 1:
         line = fp.readline()
         if not line: break
-        if string.find(line, '{1, "') > -1 and strprog.search(line) > -1:
-            lines.append("        '" + strprog.group(1) + "',\n")
+	if string.find(line, '{1, "') > -1:
+	    match = strprog.search(line)
+	    if match:
+		lines.append("        '" + match.group(1) + "',\n")
     fp.close()
     lines.sort()
 
@@ -90,4 +89,5 @@
     fp.write(string.join(format, ''))
     fp.close()
 
-if __name__ == "__main__": main()
+if __name__ == "__main__":
+    main()
diff --git a/Lib/lib-old/fmt.py b/Lib/lib-old/fmt.py
index f7c2718..3f146cb 100644
--- a/Lib/lib-old/fmt.py
+++ b/Lib/lib-old/fmt.py
@@ -461,9 +461,9 @@
 		self.paralist[para2].invert(d, pos1, pos2)
 	#
 	def search(self, prog):
-		import regex, string
+		import re, string
 		if type(prog) == type(''):
-			prog = regex.compile(string.lower(prog))
+			prog = re.compile(string.lower(prog))
 		if self.selection:
 			iold = self.selection[0][0]
 		else:
@@ -474,8 +474,9 @@
 				continue
 			p = self.paralist[i]
 			text = string.lower(p.extract())
-			if prog.search(text) >= 0:
-				a, b = prog.regs[0]
+			match = prog.search(text)
+			if match:
+				a, b = match.group(0)
 				long1 = i, a
 				long2 = i, b
 				hit = long1, long2
diff --git a/Lib/mailbox.py b/Lib/mailbox.py
index 4c4eebe..37a4636 100755
--- a/Lib/mailbox.py
+++ b/Lib/mailbox.py
@@ -5,7 +5,6 @@
 
 import rfc822
 import os
-import regex
 
 class _Mailbox:
 	def __init__(self, fp):
@@ -117,12 +116,13 @@
 
 class MHMailbox:
     def __init__(self, dirname):
-	pat = regex.compile('^[0-9][0-9]*$')
+	import re
+	pat = re.compile('^[0-9][0-9]*$')
 	self.dirname = dirname
 	files = os.listdir(self.dirname)
 	self.boxes = []
 	for f in files:
-	    if pat.match(f) == len(f):
+	    if pat.match(f):
 		self.boxes.append(f)
 
     def next(self):
@@ -187,6 +187,7 @@
 		if not msg:
 			break
 		msgs.append(msg)
+		msg.fp = None
 	if len(args) > 1:
 		num = string.atoi(args[1])
 		print 'Message %d body:'%num
diff --git a/Lib/mhlib.py b/Lib/mhlib.py
index a78b2c7..69a33ec 100644
--- a/Lib/mhlib.py
+++ b/Lib/mhlib.py
@@ -73,7 +73,7 @@
 import os
 import sys
 from stat import ST_NLINK
-import regex
+import re
 import string
 import mimetools
 import multifile
@@ -236,9 +236,9 @@
 
 # Class representing a particular folder
 
-numericprog = regex.compile('^[1-9][0-9]*$')
+numericprog = re.compile('^[1-9][0-9]*$')
 def isnumeric(str):
-    return numericprog.match(str) >= 0
+    return numericprog.match(str) is not None
 
 class Folder:
 
@@ -906,15 +906,12 @@
 	f = open(file, 'r')
     except IOError:
 	return None
-    pat = key + ':'
-    if casefold:
-	prog = regex.compile(pat, regex.casefold)
-    else:
-	prog = regex.compile(pat)
+    pat = re.escape(key) + ':'
+    prog = re.compile(pat, casefold and re.IGNORECASE)
     while 1:
 	line = f.readline()
 	if not line: break
-	if prog.match(line) >= 0:
+	if prog.match(line):
 	    text = line[len(key)+1:]
 	    while 1:
 		line = f.readline()
@@ -931,18 +928,15 @@
 	f.close()
     except IOError:
 	lines = []
-    pat = key + ':\(.*\)\n'
-    if casefold:
-	prog = regex.compile(pat, regex.casefold)
-    else:
-	prog = regex.compile(pat)
+    pat = re.escape(key) + ':(.*)\n'
+    prog = re.compile(pat, casefold and re.IGNORECASE)
     if value is None:
 	newline = None
     else:
 	newline = '%s: %s\n' % (key, value)
     for i in range(len(lines)):
 	line = lines[i]
-	if prog.match(line) == len(line):
+	if prog.match(line):
 	    if newline is None:
 		del lines[i]
 	    else:
diff --git a/Lib/nntplib.py b/Lib/nntplib.py
index a266cbd..85c2a63 100644
--- a/Lib/nntplib.py
+++ b/Lib/nntplib.py
@@ -29,7 +29,7 @@
 
 
 # Imports
-import regex
+import re
 import socket
 import string
 
@@ -313,13 +313,13 @@
 	# - list: list of (nr, value) strings
 
 	def xhdr(self, hdr, str):
+		pat = re.compile('^([0-9]+) ?(.*)\n?')
 		resp, lines = self.longcmd('XHDR ' + hdr + ' ' + str)
 		for i in range(len(lines)):
 			line = lines[i]
-			n = regex.match('^[0-9]+', line)
-			nr = line[:n]
-			if n < len(line) and line[n] == ' ': n = n+1
-			lines[i] = (nr, line[n:])
+			m = pat.match(line)
+			if m:
+				lines[i] = m.group(1, 2)
 		return resp, lines
 
 	# Process an XOVER command (optional server extension) Arguments:
@@ -354,14 +354,13 @@
 	# - list: list of (name,title) strings
 
 	def xgtitle(self, group):
-		line_pat = regex.compile("^\([^ \t]+\)[ \t]+\(.*\)$")
+		line_pat = re.compile("^([^ \t]+)[ \t]+(.*)$")
 		resp, raw_lines = self.longcmd('XGTITLE ' + group)
 		lines = []
 		for raw_line in raw_lines:
-			if line_pat.search(string.strip(raw_line)) == 0:
-				lines.append(line_pat.group(1),
-					     line_pat.group(2))
-
+			match = line_pat.search(string.strip(raw_line))
+			if match:
+				lines.append(match.group(1, 2))
 		return resp, lines
 
 	# Process an XPATH command (optional server extension) Arguments:
diff --git a/Lib/pipes.py b/Lib/pipes.py
index 0ae0b8c..2bb6ee3 100644
--- a/Lib/pipes.py
+++ b/Lib/pipes.py
@@ -61,7 +61,7 @@
 
 
 import sys
-import regex
+import re
 
 import os
 import tempfile
@@ -124,10 +124,10 @@
 		if self.steps <> [] and self.steps[-1][1] == SINK:
 			raise ValueError, \
 			      'Template.append: already ends with SINK'
-		if kind[0] == 'f' and regex.search('\$IN', cmd) < 0:
+		if kind[0] == 'f' and not re.search('\$IN\b', cmd):
 			raise ValueError, \
 			      'Template.append: missing $IN in cmd'
-		if kind[1] == 'f' and regex.search('\$OUT', cmd) < 0:
+		if kind[1] == 'f' and not re.search('\$OUT\b', cmd):
 			raise ValueError, \
 			      'Template.append: missing $OUT in cmd'
 		self.steps.append((cmd, kind))
@@ -146,10 +146,10 @@
 		if self.steps <> [] and self.steps[0][1] == SOURCE:
 			raise ValueError, \
 			      'Template.prepend: already begins with SOURCE'
-		if kind[0] == 'f' and regex.search('\$IN\>', cmd) < 0:
+		if kind[0] == 'f' and not re.search('\$IN\b', cmd):
 			raise ValueError, \
 			      'Template.prepend: missing $IN in cmd'
-		if kind[1] == 'f' and regex.search('\$OUT\>', cmd) < 0:
+		if kind[1] == 'f' and not re.search('\$OUT\b', cmd):
 			raise ValueError, \
 			      'Template.prepend: missing $OUT in cmd'
 		self.steps.insert(0, (cmd, kind))
diff --git a/Lib/plat-irix5/cddb.py b/Lib/plat-irix5/cddb.py
index 57cf3c6..acd7870 100755
--- a/Lib/plat-irix5/cddb.py
+++ b/Lib/plat-irix5/cddb.py
@@ -81,18 +81,17 @@
 		self.notes = []
 		if not hasattr(self, 'file'):
 			return
-		import regex
-		reg = regex.compile('^\\([^.]*\\)\\.\\([^:]*\\):[\t ]+\\(.*\\)')
+		import re
+		reg = re.compile(r'^([^.]*)\.([^:]*):[\t ]+(.*)')
 		while 1:
 			line = f.readline()
 			if not line:
 				break
-			if reg.match(line) == -1:
+			match = reg.match(line)
+			if not match:
 				print 'syntax error in ' + file
 				continue
-			name1 = line[reg.regs[1][0]:reg.regs[1][1]]
-			name2 = line[reg.regs[2][0]:reg.regs[2][1]]
-			value = line[reg.regs[3][0]:reg.regs[3][1]]
+			name1, name2, value = match.group(1, 2, 3)
 			if name1 == 'album':
 				if name2 == 'artist':
 					self.artist = value
diff --git a/Lib/plat-irix5/cdplayer.py b/Lib/plat-irix5/cdplayer.py
index 5c2c95a..0e27468 100755
--- a/Lib/plat-irix5/cdplayer.py
+++ b/Lib/plat-irix5/cdplayer.py
@@ -39,8 +39,8 @@
 			f = open(posix.environ['HOME'] + '/' + cdplayerrc, 'r')
 		except IOError:
 			return
-		import regex
-		reg = regex.compile('^\\([^:]*\\):\t\\(.*\\)')
+		import re
+		reg = re.compile(r'^([^:]*):\t(.*)')
 		s = self.id + '.'
 		l = len(s)
 		while 1:
@@ -49,11 +49,11 @@
 				break
 			if line[:l] == s:
 				line = line[l:]
-				if reg.match(line) == -1:
+				match = reg.match(line)
+				if not match:
 					print 'syntax error in ~/' + cdplayerrc
 					continue
-				name = line[reg.regs[1][0]:reg.regs[1][1]]
-				value = line[reg.regs[2][0]:reg.regs[2][1]]
+				name, valye = match.group(1, 2)
 				if name == 'title':
 					self.title = value
 				elif name == 'artist':
diff --git a/Lib/plat-irix5/flp.py b/Lib/plat-irix5/flp.py
index 14e2278..a277f7f 100755
--- a/Lib/plat-irix5/flp.py
+++ b/Lib/plat-irix5/flp.py
@@ -267,19 +267,18 @@
 # This function parses a line, and returns either
 # a string or a tuple (name,value)
 
-import regex
-prog = regex.compile('^\([^:]*\): *\(.*\)')
+import re
+prog = re.compile('^([^:]*): *(.*)')
 
 def _parse_line(line):
-    if prog.match(line) < 0:
+    match = prog.match(line)
+    if not match:
 	return line
-    a = prog.regs
-    name = line[:a[1][1]]
+    name, value = match.group(1, 2)
     if name[0] == 'N':
-	    name = string.joinfields(string.split(name),'')
+	    name = string.join(string.split(name),'')
 	    name = string.lower(name)
-    name = string.upper(name[0]) + name[1:]
-    value = line[a[2][0]:]
+    name = string.capitalize(name)
     try:
 	pf = _parse_func[name]
     except KeyError:
diff --git a/Lib/plat-irix6/cddb.py b/Lib/plat-irix6/cddb.py
index 57cf3c6..acd7870 100644
--- a/Lib/plat-irix6/cddb.py
+++ b/Lib/plat-irix6/cddb.py
@@ -81,18 +81,17 @@
 		self.notes = []
 		if not hasattr(self, 'file'):
 			return
-		import regex
-		reg = regex.compile('^\\([^.]*\\)\\.\\([^:]*\\):[\t ]+\\(.*\\)')
+		import re
+		reg = re.compile(r'^([^.]*)\.([^:]*):[\t ]+(.*)')
 		while 1:
 			line = f.readline()
 			if not line:
 				break
-			if reg.match(line) == -1:
+			match = reg.match(line)
+			if not match:
 				print 'syntax error in ' + file
 				continue
-			name1 = line[reg.regs[1][0]:reg.regs[1][1]]
-			name2 = line[reg.regs[2][0]:reg.regs[2][1]]
-			value = line[reg.regs[3][0]:reg.regs[3][1]]
+			name1, name2, value = match.group(1, 2, 3)
 			if name1 == 'album':
 				if name2 == 'artist':
 					self.artist = value
diff --git a/Lib/plat-irix6/cdplayer.py b/Lib/plat-irix6/cdplayer.py
index 5c2c95a..0e27468 100644
--- a/Lib/plat-irix6/cdplayer.py
+++ b/Lib/plat-irix6/cdplayer.py
@@ -39,8 +39,8 @@
 			f = open(posix.environ['HOME'] + '/' + cdplayerrc, 'r')
 		except IOError:
 			return
-		import regex
-		reg = regex.compile('^\\([^:]*\\):\t\\(.*\\)')
+		import re
+		reg = re.compile(r'^([^:]*):\t(.*)')
 		s = self.id + '.'
 		l = len(s)
 		while 1:
@@ -49,11 +49,11 @@
 				break
 			if line[:l] == s:
 				line = line[l:]
-				if reg.match(line) == -1:
+				match = reg.match(line)
+				if not match:
 					print 'syntax error in ~/' + cdplayerrc
 					continue
-				name = line[reg.regs[1][0]:reg.regs[1][1]]
-				value = line[reg.regs[2][0]:reg.regs[2][1]]
+				name, valye = match.group(1, 2)
 				if name == 'title':
 					self.title = value
 				elif name == 'artist':
diff --git a/Lib/plat-irix6/flp.py b/Lib/plat-irix6/flp.py
index 14e2278..a277f7f 100644
--- a/Lib/plat-irix6/flp.py
+++ b/Lib/plat-irix6/flp.py
@@ -267,19 +267,18 @@
 # This function parses a line, and returns either
 # a string or a tuple (name,value)
 
-import regex
-prog = regex.compile('^\([^:]*\): *\(.*\)')
+import re
+prog = re.compile('^([^:]*): *(.*)')
 
 def _parse_line(line):
-    if prog.match(line) < 0:
+    match = prog.match(line)
+    if not match:
 	return line
-    a = prog.regs
-    name = line[:a[1][1]]
+    name, value = match.group(1, 2)
     if name[0] == 'N':
-	    name = string.joinfields(string.split(name),'')
+	    name = string.join(string.split(name),'')
 	    name = string.lower(name)
-    name = string.upper(name[0]) + name[1:]
-    value = line[a[2][0]:]
+    name = string.capitalize(name)
     try:
 	pf = _parse_func[name]
     except KeyError:
diff --git a/Lib/posixpath.py b/Lib/posixpath.py
index 965184b..9960801 100644
--- a/Lib/posixpath.py
+++ b/Lib/posixpath.py
@@ -266,15 +266,15 @@
 	if '$' not in path:
 		return path
 	if not _varprog:
-		import regex
-		_varprog = regex.compile('$\([a-zA-Z0-9_]+\|{[^}]*}\)')
+		import re
+		_varprog = re.compile(r'\$(\w+|\{[^}]*\})')
 	i = 0
 	while 1:
-		i = _varprog.search(path, i)
-		if i < 0:
+		m = _varprog.search(path, i)
+		if not m:
 			break
-		name = _varprog.group(1)
-		j = i + len(_varprog.group(0))
+		i, j = m.span(0)
+		name = m.group(1)
 		if name[:1] == '{' and name[-1:] == '}':
 			name = name[1:-1]
 		if os.environ.has_key(name):
diff --git a/Lib/pstats.py b/Lib/pstats.py
index 7e4a385..5bc70b3 100644
--- a/Lib/pstats.py
+++ b/Lib/pstats.py
@@ -35,7 +35,7 @@
 import time
 import string
 import marshal
-import regex
+import re
 
 #**************************************************************************
 # Class Stats documentation
@@ -300,7 +300,7 @@
 		if type(sel) == type(""):
 			new_list = []
 			for func in list:
-				if 0<=regex.search(sel, func_std_string(func)):
+				if re.search(sel, func_std_string(func)):
 					new_list.append(func)
 		else:
 			count = len(list)
diff --git a/Lib/rfc822.py b/Lib/rfc822.py
index 6e584eb..70ac1f8 100644
--- a/Lib/rfc822.py
+++ b/Lib/rfc822.py
@@ -38,7 +38,7 @@
 # There are also some utility functions here.
 
 
-import regex
+import re
 import string
 import time
 
@@ -311,7 +311,7 @@
 
 error = 'parseaddr.error'
 
-specials = regex.compile('[][()<>,.;:@\\" \000-\037\177-\377]')
+specials = re.compile(r'[][()<>,.;:@\" \000-\037\177-\377]')
 
 def quote(str):
 	return '"%s"' % string.join(
@@ -408,7 +408,7 @@
 				else:
 					name.append(token[1])
 			elif token[0] == 1 and cur is addr:
-				if specials.search(token[1]) >= 0:
+				if specials.search(token[1]):
 					cur.append(quote(token[1]))
 				else:
 					cur.append(token[1])
@@ -423,7 +423,7 @@
 			if token[0] == 2:
 				name.append(token[1])
 			elif token[0] == 1:
-				if specials.search(token[1]) >= 0:
+				if specials.search(token[1]):
 					addr.append(quote(token[1]))
 				else:
 					addr.append(token[1])
@@ -563,4 +563,3 @@
 	print 'keys =', m.keys()
 	print 'values =', m.values()
 	print 'items =', m.items()
-	
diff --git a/Lib/string.py b/Lib/string.py
index 5cf5b6f..3f65978 100644
--- a/Lib/string.py
+++ b/Lib/string.py
@@ -193,17 +193,20 @@
 	return r
 
 # Convert string to float
+re = None
 def atof(str):
-	import regex
+	global re
+	if re is None:
+		import re
 	sign = ''
-	s = str
+	s = strip(str)
 	if s and s[0] in '+-':
 		sign = s[0]
 		s = s[1:]
 	if not s:
 		raise ValueError, 'non-float argument to string.atof'
 	while s[0] == '0' and len(s) > 1 and s[1] in digits: s = s[1:]
-	if regex.match('[0-9]*\(\.[0-9]*\)?\([eE][-+]?[0-9]+\)?', s) != len(s):
+	if not re.match('[0-9]*(\.[0-9]*)?([eE][-+]?[0-9]+)?$', s):
 		raise ValueError, 'non-float argument to string.atof'
 	try:
 		return float(eval(sign + s))
diff --git a/Lib/stringold.py b/Lib/stringold.py
index 5cf5b6f..3f65978 100644
--- a/Lib/stringold.py
+++ b/Lib/stringold.py
@@ -193,17 +193,20 @@
 	return r
 
 # Convert string to float
+re = None
 def atof(str):
-	import regex
+	global re
+	if re is None:
+		import re
 	sign = ''
-	s = str
+	s = strip(str)
 	if s and s[0] in '+-':
 		sign = s[0]
 		s = s[1:]
 	if not s:
 		raise ValueError, 'non-float argument to string.atof'
 	while s[0] == '0' and len(s) > 1 and s[1] in digits: s = s[1:]
-	if regex.match('[0-9]*\(\.[0-9]*\)?\([eE][-+]?[0-9]+\)?', s) != len(s):
+	if not re.match('[0-9]*(\.[0-9]*)?([eE][-+]?[0-9]+)?$', s):
 		raise ValueError, 'non-float argument to string.atof'
 	try:
 		return float(eval(sign + s))
diff --git a/Lib/token.py b/Lib/token.py
index 3d358a3..888bb41 100755
--- a/Lib/token.py
+++ b/Lib/token.py
@@ -7,10 +7,7 @@
 #  To update the symbols in this file, 'cd' to the top directory of
 #  the python source tree after building the interpreter and run:
 #
-#    PYTHONPATH=./Lib ./python Lib/token.py
-#
-#  (this path allows the import of string.py and regexmodule.so
-#  for a site with no installation in place)
+#    python Lib/token.py
 
 #--start constants--
 ENDMARKER = 0
@@ -73,7 +70,7 @@
 
 
 def main():
-    import regex
+    import re
     import string
     import sys
     args = sys.argv[1:]
@@ -88,13 +85,14 @@
 	sys.exit(1)
     lines = string.splitfields(fp.read(), "\n")
     fp.close()
-    re = regex.compile(
-	"#define[ \t][ \t]*\([A-Z][A-Z_]*\)[ \t][ \t]*\([0-9][0-9]*\)",
-	regex.casefold)
+    prog = re.compile(
+	"#define[ \t][ \t]*([A-Z][A-Z_]*)[ \t][ \t]*([0-9][0-9]*)",
+	re.IGNORECASE)
     tokens = {}
     for line in lines:
-	if re.match(line) > -1:
-	    name, val = re.group(1, 2)
+	match = prog.match(line)
+	if match:
+	    name, val = match.group(1, 2)
 	    val = string.atoi(val)
 	    tokens[val] = name		# reverse so we can sort them...
     keys = tokens.keys()
diff --git a/Lib/tzparse.py b/Lib/tzparse.py
index ef325e9..358e0cc 100644
--- a/Lib/tzparse.py
+++ b/Lib/tzparse.py
@@ -2,23 +2,22 @@
 # XXX Unfinished.
 # XXX Only the typical form "XXXhhYYY;ddd/hh,ddd/hh" is currently supported.
 
-tzpat = '^\([A-Z][A-Z][A-Z]\)\([-+]?[0-9]+\)\([A-Z][A-Z][A-Z]\);' + \
-	  '\([0-9]+\)/\([0-9]+\),\([0-9]+\)/\([0-9]+\)$'
+tzpat = ('^([A-Z][A-Z][A-Z])([-+]?[0-9]+)([A-Z][A-Z][A-Z]);'
+	  '([0-9]+)/([0-9]+),([0-9]+)/([0-9]+)$')
 
 tzprog = None
 
 def tzparse(tzstr):
 	global tzprog
 	if tzprog == None:
-		import regex
-		tzprog = regex.compile(tzpat)
-	if tzprog.match(tzstr) < 0:
+		import re
+		tzprog = re.compile(tzpat)
+	match = tzprog.match(tzstr)
+	if not match:
 		raise ValueError, 'not the TZ syntax I understand'
-	regs = tzprog.regs
 	subs = []
 	for i in range(1, 8):
-		a, b = regs[i]
-		subs.append(tzstr[a:b])
+		subs.append(match.group(i))
 	for i in (1, 3, 4, 5, 6):
 		subs[i] = eval(subs[i])
 	[tzname, delta, dstname, daystart, hourstart, dayend, hourend] = subs
