diff --git a/Mac/Tools/IDE/PyBrowser.py b/Mac/Tools/IDE/PyBrowser.py
index c1abbac..853392f 100644
--- a/Mac/Tools/IDE/PyBrowser.py
+++ b/Mac/Tools/IDE/PyBrowser.py
@@ -3,7 +3,7 @@
 import struct
 import string
 import types
-import regex
+import re
 
 nullid = '\0\0'
 closedid = struct.pack('h', 468)
@@ -13,11 +13,15 @@
 
 arrows = (nullid, closedid, openid, closedsolidid, opensolidid)
 
-has_ctlcharsRE = regex.compile('[\000-\037\177-\377]')
-
+has_ctlcharsRE = re.compile('[\000-\037\177-\377]')
+def ctlcharsREsearch(str):
+	if has_ctlcharsRE(str) is None:
+		return -1
+	return 1
+	
 def double_repr(key, value, truncvalue = 0, 
 			type = type, StringType = types.StringType,
-			has_ctlchars = has_ctlcharsRE.search, _repr = repr, str = str):
+			has_ctlchars = ctlcharsREsearch, _repr = repr, str = str):
 	if type(key) == StringType and has_ctlchars(key) < 0:
 		key = str(key)
 	else:
diff --git a/Mac/Tools/IDE/PyDocSearch.py b/Mac/Tools/IDE/PyDocSearch.py
index f975026..b036556 100644
--- a/Mac/Tools/IDE/PyDocSearch.py
+++ b/Mac/Tools/IDE/PyDocSearch.py
@@ -2,7 +2,7 @@
 import Standard_Suite
 import Required_Suite
 import WWW_Suite
-import regex
+import re
 import W
 import macfs
 import os
@@ -29,16 +29,16 @@
 #SIGNATURE='MSIE' # MS Explorer
 SIGNATURE='MOSS' # Netscape
 
-_titlepat = regex.compile('<title>\([^<]*\)</title>')
+_titlepat = re.compile('<title>\([^<]*\)</title>')
 
 def sucktitle(path):
 	f = open(path)
 	text = f.read(1024) # assume the title is in the first 1024 bytes
 	f.close()
 	lowertext = string.lower(text)
-	if _titlepat.search(lowertext) > 0:
-		a, b = _titlepat.regs[1]
-		return text[a:b]
+	matcher = _titlepat.search(lowertext)
+	if matcher:
+		return matcher.group(1)
 	return path
 
 def verifydocpath(docpath):
diff --git a/Mac/Tools/IDE/PyEdit.py b/Mac/Tools/IDE/PyEdit.py
index 7274a1e..fc8503a 100644
--- a/Mac/Tools/IDE/PyEdit.py
+++ b/Mac/Tools/IDE/PyEdit.py
@@ -15,7 +15,7 @@
 import sys
 import string
 import marshal
-import regex
+import re
 
 try:
 	import Wthreading
@@ -25,7 +25,8 @@
 	haveThreading = Wthreading.haveThreading
 
 _scriptuntitledcounter = 1
-_wordchars = string.letters + string.digits + "_"
+# _wordchars = string.letters + string.digits + "_"
+_wordchars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_'
 
 
 runButtonLabels = ["Run all", "Stop!"]
@@ -553,7 +554,6 @@
 		if indent == 1:
 			classname = ''
 			alllines = string.split(alltext, '\r')
-			identifieRE_match = _identifieRE.match
 			for i in range(selfirstline - 1, -1, -1):
 				line = alllines[i]
 				if line[:6] == 'class ':
@@ -673,7 +673,6 @@
 	
 	def getclasslist(self):
 		from string import find, strip
-		import re
 		methodRE = re.compile(r"\r[ \t]+def ")
 		findMethod = methodRE.search
 		editor = self.editgroup.editor
@@ -715,7 +714,6 @@
 		offsetToLine = editor.ted.WEOffsetToLine
 		getLineRange = editor.ted.WEGetLineRange
 		append = classlist.append
-		identifieRE_match = _identifieRE.match
 		for pos, tag in list:
 			lineno = offsetToLine(pos)
 			lineStart, lineEnd = getLineRange(lineno)
@@ -794,14 +792,13 @@
 	# first, escape special regex chars
 	for esc in "\\[].*^+$?":
 		word = _escape(word, esc)
-	import regex
 	notwordcharspat = '[^' + _wordchars + ']'
-	pattern = '\(' + word + '\)'
+	pattern = '(' + word + ')'
 	if word[0] in _wordchars:
 		pattern = notwordcharspat + pattern
 	if word[-1] in _wordchars:
 		pattern = pattern + notwordcharspat
-	return regex.compile(pattern)
+	return re.compile(pattern)
 
 class SearchEngine:
 	
@@ -935,9 +932,9 @@
 		while 1:
 			if self.parms["wholeword"]:
 				wholewordRE = _makewholewordpattern(find)
-				wholewordRE.search(text, pos)
-				if wholewordRE.regs:
-					pos = wholewordRE.regs[1][0]
+				match = wholewordRE.search(text, pos)
+				if match:
+					pos = match.start(1)
 				else:
 					pos = -1
 			else:
@@ -997,9 +994,9 @@
 		selstart, selend = min(selstart, selend), max(selstart, selend)
 		if self.parms["wholeword"]:
 			wholewordRE = _makewholewordpattern(find)
-			wholewordRE.search(text, selend)
-			if wholewordRE.regs:
-				pos = wholewordRE.regs[1][0]
+			match = wholewordRE.search(text, selend)
+			if match:
+				pos = match.start(1)
 			else:
 				pos = -1
 		else:
@@ -1009,9 +1006,9 @@
 			return 1
 		elif self.parms["wrap"]:
 			if self.parms["wholeword"]:
-				wholewordRE.search(text, 0)
-				if wholewordRE.regs:
-					pos = wholewordRE.regs[1][0]
+				match = wholewordRE.search(text, 0)
+				if match:
+					pos = match.start(1)
 				else:
 					pos = -1
 			else:
@@ -1169,12 +1166,19 @@
 		PyDebugger.stop()
 
 
-_identifieRE = regex.compile("[A-Za-z_][A-Za-z_0-9]*")
+_identifieRE = re.compile("[A-Za-z_][A-Za-z_0-9]*")
+
+def identifieRE_match(str):
+	match = _identifieRE.match(str)
+	if not match:
+		return -1
+	return match.end()
 
 def _filename_as_modname(fname):
 	if fname[-3:] == '.py':
 		modname = fname[:-3]
-		if _identifieRE.match(modname) == len(modname):
+		match = _identifieRE.match(modname)
+		if match and match.start() == 0 and match.end() == len(modname):
 			return string.join(string.split(modname, '.'), '_')
 
 def findeditor(topwindow, fromtop = 0):
diff --git a/Mac/Tools/IDE/PyFontify.py b/Mac/Tools/IDE/PyFontify.py
index 02de08e..b5d6102 100644
--- a/Mac/Tools/IDE/PyFontify.py
+++ b/Mac/Tools/IDE/PyFontify.py
@@ -27,7 +27,7 @@
 
 __version__ = "0.3.3"
 
-import string, regex
+import string, re
 
 # First a little helper, since I don't like to repeat things. (Tismer speaking)
 import string
@@ -87,10 +87,10 @@
 keyPat = keyPat[:-2] + "\)" + nonKeyPat
 
 matchPat = commentPat + "\|" + keyPat + "\|" + tripleQuotePat + "\|" + quotePat
-matchRE = regex.compile(matchPat)
+matchRE = re.compile(matchPat)
 
 idKeyPat = "[ \t]*[A-Za-z_][A-Za-z_0-9.]*"	# Ident w. leading whitespace.
-idRE = regex.compile(idKeyPat)
+idRE = re.compile(idKeyPat)
 
 
 def fontify(pytext, searchfrom = 0, searchto = None):
@@ -98,9 +98,7 @@
 		searchto = len(pytext)
 	# Cache a few attributes for quicker reference.
 	search = matchRE.search
-	group = matchRE.group
 	idSearch = idRE.search
-	idGroup = idRE.group
 	
 	tags = []
 	tags_append = tags.append
@@ -112,10 +110,10 @@
 	start = 0
 	end = searchfrom
 	while 1:
-		start = search(pytext, end)
-		if start < 0 or start >= searchto:
+		m = search(pytext, end)
+		if not m or m.start() >= searchto:
 			break	# EXIT LOOP
-		match = group(0)
+		match = m.group(0)
 		end = start + len(match)
 		c = match[0]
 		if c not in "#'\"":
@@ -133,9 +131,9 @@
 			# If this was a defining keyword, look ahead to the
 			# following identifier.
 			if match in ["def", "class"]:
-				start = idSearch(pytext, end)
-				if start == end:
-					match = idGroup(0)
+				m = idSearch(pytext, end)
+				if m and m.start() == end:
+					match = m.group(0)
 					end = start + len(match)
 					tags_append((identifierTag, start, end, None))
 		elif c == "#":
diff --git a/Mac/Tools/IDE/Wtext.py b/Mac/Tools/IDE/Wtext.py
index 8c1662d..11b0276 100644
--- a/Mac/Tools/IDE/Wtext.py
+++ b/Mac/Tools/IDE/Wtext.py
@@ -603,9 +603,9 @@
 				self.drawselframe(1)
 
 
-import regex
-commentPat = regex.compile("[ \t]*\(#\)")
-indentPat = regex.compile("\t*")
+import re
+commentPat = re.compile("[ \t]*\(#\)")
+indentPat = re.compile("\t*")
 
 class PyEditor(TextEditor):
 	
@@ -659,9 +659,9 @@
 		snippet = self.getselectedtext()
 		lines = string.split(snippet, '\r')
 		for i in range(len(lines)):
-			res = commentPat.match(lines[i]) >= 0
-			if res > 0:
-				pos = commentPat.regs[1][0]
+			m = commentPat.match(lines[i])
+			if m:
+				pos = m.start(1)
 				lines[i] = lines[i][:pos] + lines[i][pos+1:]
 		snippet = string.join(lines, '\r')
 		self.insert(snippet)
@@ -676,8 +676,9 @@
 		indent = 3000 # arbitrary large number...
 		for line in lines:
 			if string.strip(line):
-				if indentPat.match(line):
-					indent = min(indent, indentPat.regs[0][1])
+				m = indentPat.match(line)
+				if m:
+					indent = min(indent, m.regs[0][1])
 				else:
 					indent = 0
 					break
