diff --git a/Lib/re.py b/Lib/re.py
index e67d142..4198773 100644
--- a/Lib/re.py
+++ b/Lib/re.py
@@ -30,12 +30,12 @@
 def _cachecompile(pattern, flags=0):
     key = (pattern, flags)
     try:
-	return _cache[key]
+        return _cache[key]
     except KeyError:
-	pass
+        pass
     value = compile(pattern, flags)
     if len(_cache) >= _MAXCACHE:
-	_cache.clear()
+        _cache.clear()
     _cache[key] = value
     return value
 
@@ -47,17 +47,17 @@
   
 def sub(pattern, repl, string, count=0):
     if type(pattern) == type(''):
-	pattern = _cachecompile(pattern)
+        pattern = _cachecompile(pattern)
     return pattern.sub(repl, string, count)
 
 def subn(pattern, repl, string, count=0):
     if type(pattern) == type(''):
-	pattern = _cachecompile(pattern)
+        pattern = _cachecompile(pattern)
     return pattern.subn(repl, string, count)
   
 def split(pattern, string, maxsplit=0):
     if type(pattern) == type(''):
-	pattern = _cachecompile(pattern)
+        pattern = _cachecompile(pattern)
     return pattern.split(string, maxsplit)
 
 def escape(pattern):
@@ -65,10 +65,10 @@
     result = []
     alphanum=string.letters+'_'+string.digits
     for char in pattern:
-	if char not in alphanum:
-	    if char == '\000': result.append(r'\000')
-	    else: result.append('\\' + char)
-	else: result.append(char)
+        if char not in alphanum:
+            if char == '\000': result.append(r'\000')
+            else: result.append('\\' + char)
+        else: result.append(char)
     return string.join(result, '')
 
 def compile(pattern, flags=0):
@@ -84,137 +84,137 @@
 
 class RegexObject:
     def __init__(self, pattern, flags, code, groupindex):
-	self.code = code 
-	self.flags = flags
-	self.pattern = pattern
-	self.groupindex = groupindex
+        self.code = code 
+        self.flags = flags
+        self.pattern = pattern
+        self.groupindex = groupindex
 
     def search(self, string, pos=0, endpos=None):
-	"""Scan through string looking for a match to the pattern, returning
-	a MatchObject instance, or None if no match was found."""
+        """Scan through string looking for a match to the pattern, returning
+        a MatchObject instance, or None if no match was found."""
 
-	if endpos is None or endpos>len(string): 
-	    endpos=len(string)
-	if endpos<pos: endpos=pos
-	regs = self.code.match(string, pos, endpos, 0)
-	if regs is None:
-	    return None
-	self._num_regs=len(regs)
-	
-	return MatchObject(self,
-			   string,
-			   pos, endpos,
-			   regs)
+        if endpos is None or endpos>len(string): 
+            endpos=len(string)
+        if endpos<pos: endpos=pos
+        regs = self.code.match(string, pos, endpos, 0)
+        if regs is None:
+            return None
+        self._num_regs=len(regs)
+        
+        return MatchObject(self,
+                           string,
+                           pos, endpos,
+                           regs)
     
     def match(self, string, pos=0, endpos=None):
-	"""Try to apply the pattern at the start of the string, returning
-	a MatchObject instance, or None if no match was found."""
+        """Try to apply the pattern at the start of the string, returning
+        a MatchObject instance, or None if no match was found."""
 
-	if endpos is None or endpos>len(string): 
-	    endpos=len(string)
-	if endpos<pos: endpos=pos
-	regs = self.code.match(string, pos, endpos, ANCHORED)
-	if regs is None:
-	    return None
-	self._num_regs=len(regs)
-	return MatchObject(self,
-			   string,
-			   pos, endpos,
-			   regs)
+        if endpos is None or endpos>len(string): 
+            endpos=len(string)
+        if endpos<pos: endpos=pos
+        regs = self.code.match(string, pos, endpos, ANCHORED)
+        if regs is None:
+            return None
+        self._num_regs=len(regs)
+        return MatchObject(self,
+                           string,
+                           pos, endpos,
+                           regs)
     
     def sub(self, repl, string, count=0):
-	"""Return the string obtained by replacing the leftmost
-	non-overlapping occurrences of the pattern in string by the
-	replacement repl""" 
+        """Return the string obtained by replacing the leftmost
+        non-overlapping occurrences of the pattern in string by the
+        replacement repl""" 
 
         return self.subn(repl, string, count)[0]
     
     def subn(self, repl, source, count=0): 
-	"""Return a 2-tuple containing (new_string, number).
-	new_string is the string obtained by replacing the leftmost
-	non-overlapping occurrences of the pattern in string by the
-	replacement repl.  number is the number of substitutions that
-	were made."""
+        """Return a 2-tuple containing (new_string, number).
+        new_string is the string obtained by replacing the leftmost
+        non-overlapping occurrences of the pattern in string by the
+        replacement repl.  number is the number of substitutions that
+        were made."""
 
-	if count < 0:
-	    raise error, "negative substitution count"
-	if count == 0:
-	    import sys
-	    count = sys.maxint
-	if type(repl) == type(''):
-	    if '\\' in repl:
-		repl = lambda m, r=repl: pcre_expand(m, r)
-	    else:
-		repl = lambda m, r=repl: r
-	n = 0           # Number of matches
-	pos = 0         # Where to start searching
-	lastmatch = -1  # End of last match
-	results = []    # Substrings making up the result
-	end = len(source)
-	while n < count and pos <= end:
-	    m = self.search(source, pos)
-	    if not m:
-		break
-	    i, j = m.span(0)
-	    if i == j == lastmatch:
-		# Empty match adjacent to previous match
-		pos = pos + 1
-		results.append(source[lastmatch:pos])
-		continue
-	    if pos < i:
-		results.append(source[pos:i])
-	    results.append(repl(m))
-	    pos = lastmatch = j
-	    if i == j:
-		# Last match was empty; don't try here again
-		pos = pos + 1
-		results.append(source[lastmatch:pos])
-	    n = n + 1
-	results.append(source[pos:])
-	return (string.join(results, ''), n)
-									    
+        if count < 0:
+            raise error, "negative substitution count"
+        if count == 0:
+            import sys
+            count = sys.maxint
+        if type(repl) == type(''):
+            if '\\' in repl:
+                repl = lambda m, r=repl: pcre_expand(m, r)
+            else:
+                repl = lambda m, r=repl: r
+        n = 0           # Number of matches
+        pos = 0         # Where to start searching
+        lastmatch = -1  # End of last match
+        results = []    # Substrings making up the result
+        end = len(source)
+        while n < count and pos <= end:
+            m = self.search(source, pos)
+            if not m:
+                break
+            i, j = m.span(0)
+            if i == j == lastmatch:
+                # Empty match adjacent to previous match
+                pos = pos + 1
+                results.append(source[lastmatch:pos])
+                continue
+            if pos < i:
+                results.append(source[pos:i])
+            results.append(repl(m))
+            pos = lastmatch = j
+            if i == j:
+                # Last match was empty; don't try here again
+                pos = pos + 1
+                results.append(source[lastmatch:pos])
+            n = n + 1
+        results.append(source[pos:])
+        return (string.join(results, ''), n)
+                                                                            
     def split(self, source, maxsplit=0):
-	"""Split \var{string} by the occurrences of the pattern,
-	returning a list containing the resulting substrings."""
+        """Split \var{string} by the occurrences of the pattern,
+        returning a list containing the resulting substrings."""
 
-	if maxsplit < 0:
-	    raise error, "negative split count"
-	if maxsplit == 0:
-	    import sys
-	    maxsplit = sys.maxint
-	n = 0
-	pos = 0
-	lastmatch = 0
-	results = []
-	end = len(source)
-	while n < maxsplit:
-	    m = self.search(source, pos)
-	    if not m:
-		break
-	    i, j = m.span(0)
-	    if i == j:
-		# Empty match
-		if pos >= end:
-		    break
-		pos = pos+1
-		continue
-	    results.append(source[lastmatch:i])
-	    g = m.groups()
-	    if g:
-		if type(g)==type( "" ): g = [g]
-		results[len(results):] = list(g)
-	    pos = lastmatch = j
-	    n = n + 1
-	results.append(source[lastmatch:])
-	return results
+        if maxsplit < 0:
+            raise error, "negative split count"
+        if maxsplit == 0:
+            import sys
+            maxsplit = sys.maxint
+        n = 0
+        pos = 0
+        lastmatch = 0
+        results = []
+        end = len(source)
+        while n < maxsplit:
+            m = self.search(source, pos)
+            if not m:
+                break
+            i, j = m.span(0)
+            if i == j:
+                # Empty match
+                if pos >= end:
+                    break
+                pos = pos+1
+                continue
+            results.append(source[lastmatch:i])
+            g = m.groups()
+            if g:
+                if type(g)==type( "" ): g = [g]
+                results[len(results):] = list(g)
+            pos = lastmatch = j
+            n = n + 1
+        results.append(source[lastmatch:])
+        return results
 
     # The following 3 functions were contributed by Mike Fletcher, and
     # allow pickling and unpickling of RegexObject instances.
     def __getinitargs__(self):
         return (None,None,None,None) # any 4 elements, to work around
                                      # problems with the
-				     # pickle/cPickle modules not yet 
-				     # ignoring the __init__ function
+                                     # pickle/cPickle modules not yet 
+                                     # ignoring the __init__ function
     def __getstate__(self):
         return self.pattern, self.flags, self.groupindex
     def __setstate__(self, statetuple):
@@ -225,70 +225,70 @@
 
 class MatchObject:
     def __init__(self, re, string, pos, endpos, regs):
-	self.re = re
-	self.string = string
-	self.pos = pos 
-	self.endpos = endpos
-	self.regs = regs
-	
+        self.re = re
+        self.string = string
+        self.pos = pos 
+        self.endpos = endpos
+        self.regs = regs
+        
     def start(self, g = 0):
-	"Return the start of the substring matched by group g"
-	if type(g) == type(''):
-	    try:
-		g = self.re.groupindex[g]
-	    except (KeyError, TypeError):
-		raise IndexError, ('group "' + g + '" is undefined')
-	return self.regs[g][0]
+        "Return the start of the substring matched by group g"
+        if type(g) == type(''):
+            try:
+                g = self.re.groupindex[g]
+            except (KeyError, TypeError):
+                raise IndexError, ('group "' + g + '" is undefined')
+        return self.regs[g][0]
     
     def end(self, g = 0):
-	"Return the end of the substring matched by group g"
-	if type(g) == type(''):
-	    try:
-		g = self.re.groupindex[g]
-	    except (KeyError, TypeError):
-		raise IndexError, ('group "' + g + '" is undefined')
-	return self.regs[g][1]
+        "Return the end of the substring matched by group g"
+        if type(g) == type(''):
+            try:
+                g = self.re.groupindex[g]
+            except (KeyError, TypeError):
+                raise IndexError, ('group "' + g + '" is undefined')
+        return self.regs[g][1]
     
     def span(self, g = 0):
-	"""Return a tuple containing the start,end of the substring 
-	matched by group g"""
-	if type(g) == type(''):
-	    try:
-		g = self.re.groupindex[g]
-	    except (KeyError, TypeError):
-		raise IndexError, ('group "' + g + '" is undefined')
-	return self.regs[g]
+        """Return a tuple containing the start,end of the substring 
+        matched by group g"""
+        if type(g) == type(''):
+            try:
+                g = self.re.groupindex[g]
+            except (KeyError, TypeError):
+                raise IndexError, ('group "' + g + '" is undefined')
+        return self.regs[g]
     
     def groups(self):
-	"Return a tuple containing all subgroups of the match object"
-	result = []
-	for g in range(1, self.re._num_regs):
-	    if (self.regs[g][0] == -1) or (self.regs[g][1] == -1):
-		result.append(None)
-	    else:
-		result.append(self.string[self.regs[g][0]:self.regs[g][1]])
-	return tuple(result)
+        "Return a tuple containing all subgroups of the match object"
+        result = []
+        for g in range(1, self.re._num_regs):
+            if (self.regs[g][0] == -1) or (self.regs[g][1] == -1):
+                result.append(None)
+            else:
+                result.append(self.string[self.regs[g][0]:self.regs[g][1]])
+        return tuple(result)
 
     def group(self, *groups):
-	"Return one or more groups of the match."
-	if len(groups) == 0:
-	    groups = (0,)
-	result = []
-	for g in groups:
-	    if type(g) == type(''):
-		try:
-		    g = self.re.groupindex[g]
-		except (KeyError, TypeError):
-		    raise IndexError, ('group "' + g + '" is undefined')
-	    if len(self.regs)<=g: raise IndexError, ('group "' + str(g) + '" is undefined')
-	    elif (self.regs[g][0] == -1) or (self.regs[g][1] == -1):
-		result.append(None)
-	    else:
-		result.append(self.string[self.regs[g][0]:self.regs[g][1]])
-	if len(result) > 1:
-	    return tuple(result)
-	elif len(result) == 1:
-	    return result[0]
-	else:
-	    return ()
+        "Return one or more groups of the match."
+        if len(groups) == 0:
+            groups = (0,)
+        result = []
+        for g in groups:
+            if type(g) == type(''):
+                try:
+                    g = self.re.groupindex[g]
+                except (KeyError, TypeError):
+                    raise IndexError, ('group "' + g + '" is undefined')
+            if len(self.regs)<=g: raise IndexError, ('group "' + str(g) + '" is undefined')
+            elif (self.regs[g][0] == -1) or (self.regs[g][1] == -1):
+                result.append(None)
+            else:
+                result.append(self.string[self.regs[g][0]:self.regs[g][1]])
+        if len(result) > 1:
+            return tuple(result)
+        elif len(result) == 1:
+            return result[0]
+        else:
+            return ()
 
