Commit 7d16cb4d authored by Guido van Rossum's avatar Guido van Rossum

Jeffrey's latest.

parent dbf139fc
...@@ -51,13 +51,13 @@ def search(pattern, string, flags=0): ...@@ -51,13 +51,13 @@ def search(pattern, string, flags=0):
return compile(pattern, flags).search(string) return compile(pattern, flags).search(string)
def sub(pattern, repl, string, count=0): def sub(pattern, repl, string, count=0):
pass return compile(pattern).sub(repl, string, count)
def subn(pattern, repl, string, count=0): def subn(pattern, repl, string, count=0):
pass return compile(pattern).subn(repl, string, count)
def split(string, pattern, maxsplit=0): def split(pattern, string, maxsplit=0):
pass return compile(pattern).subn(string, maxsplit)
# #
# #
...@@ -79,21 +79,6 @@ class RegexObject: ...@@ -79,21 +79,6 @@ class RegexObject:
else: else:
self.anchor = 0 self.anchor = 0
self.buffer = assemble(code) self.buffer = assemble(code)
def match(self, string, pos=0):
regs = reop.match(self.buffer,
self.num_regs,
self.flags,
self.fastmap.can_be_null,
self.fastmap.fastmap(),
self.anchor,
string,
pos)
if regs is None:
return None
return MatchObject(self,
string,
pos,
regs)
def search(self, string, pos=0): def search(self, string, pos=0):
regs = reop.search(self.buffer, regs = reop.search(self.buffer,
self.num_regs, self.num_regs,
...@@ -109,6 +94,27 @@ class RegexObject: ...@@ -109,6 +94,27 @@ class RegexObject:
string, string,
pos, pos,
regs) regs)
def match(self, string, pos=0):
regs = reop.match(self.buffer,
self.num_regs,
self.flags,
self.fastmap.can_be_null,
self.fastmap.fastmap(),
self.anchor,
string,
pos)
if regs is None:
return None
return MatchObject(self,
string,
pos,
regs)
def sub(self, repl, string, count=0):
pass
def subn(self, repl, string, count=0):
pass
def split(self, string, maxsplit=0):
pass
class MatchObject: class MatchObject:
def __init__(self, re, string, pos, regs): def __init__(self, re, string, pos, regs):
...@@ -116,34 +122,49 @@ class MatchObject: ...@@ -116,34 +122,49 @@ class MatchObject:
self.string = string self.string = string
self.pos = pos self.pos = pos
self.regs = regs self.regs = regs
def start(self, i): def start(self, g):
if type(i) == type(''): if type(g) == type(''):
try: try:
i = self.re.groupindex[i] g = self.re.groupindex[g]
except (KeyError, TypeError): except (KeyError, TypeError):
raise IndexError raise IndexError, ('group "' + g + '" is undefined')
return self.regs[i][0] return self.regs[g][0]
def end(self, i): def end(self, g):
if type(i) == type(''): if type(g) == type(''):
try: try:
i = self.re.groupindex[i] g = self.re.groupindex[g]
except (KeyError, TypeError): except (KeyError, TypeError):
raise IndexError raise IndexError, ('group "' + g + '" is undefined')
return self.regs[i][1] return self.regs[g][1]
def span(self, i): def span(self, g):
if type(i) == type(''): if type(g) == type(''):
try: try:
i = self.re.groupindex[i] g = self.re.groupindex[g]
except (KeyError, TypeError): except (KeyError, TypeError):
raise IndexError raise IndexError, ('group "' + g + '" is undefined')
return self.regs[i] return self.regs[g]
def group(self, i): def group(self, *groups):
if type(i) == type(''): if len(groups) == 0:
try: groups = range(1, self.re.num_regs)
i = self.re.groupindex[i] result = []
except (KeyError, TypeError): for g in groups:
raise IndexError if type(g) == type(''):
return self.string[self.regs[i][0]:self.regs[i][1]] try:
g = self.re.groupindex[g]
except (KeyError, TypeError):
raise IndexError, ('group "' + g + '" is undefined')
if g >= len(self.regs):
result.append(None)
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 ()
# #
# A set of classes to make assembly a bit easier, if a bit verbose. # A set of classes to make assembly a bit easier, if a bit verbose.
...@@ -331,7 +352,7 @@ class SyntaxSpec(Instruction): ...@@ -331,7 +352,7 @@ class SyntaxSpec(Instruction):
def assemble(self, postition, labels): def assemble(self, postition, labels):
return self.opcode + chr(self.syntax) return self.opcode + chr(self.syntax)
class SyntaxSpec(Instruction): class NotSyntaxSpec(Instruction):
name = 'notsyntaxspec' name = 'notsyntaxspec'
def __init__(self, syntax): def __init__(self, syntax):
self.syntax = syntax self.syntax = syntax
...@@ -382,13 +403,12 @@ def assemble(instructions): ...@@ -382,13 +403,12 @@ def assemble(instructions):
# #
def escape(pattern): def escape(pattern):
result = '' result = []
for char in pattern: for char in pattern:
if 'word' not in syntax_table[char]: if 'word' not in syntax_table[char]:
result = result + '\\' + char result.append('\\')
else: result.append(char)
result = result + char return string.join(result, '')
return result
# #
# #
...@@ -631,7 +651,7 @@ def compile(pattern, flags=0): ...@@ -631,7 +651,7 @@ def compile(pattern, flags=0):
expr + \ expr + \
[Jump(-1), [Jump(-1),
Label(label)]) Label(label)])
stack.append([('|',)]) stack.append([Alternation()])
label = label + 1 label = label + 1
elif char == '(': elif char == '(':
...@@ -693,12 +713,13 @@ def compile(pattern, flags=0): ...@@ -693,12 +713,13 @@ def compile(pattern, flags=0):
stack.append([FunctionCallout(name)]) stack.append([FunctionCallout(name)])
else: else:
raise error, 'unknown Python extension' raise error, ('unknown Python extension: ' + \
pattern[index])
elif pattern[index] == ':': elif pattern[index] == ':':
# grouping, but no registers # grouping, but no registers
index = index + 1 index = index + 1
stack.append([('(', -1)]) stack.append([OpenParen(-1)])
elif pattern[index] == '#': elif pattern[index] == '#':
# comment # comment
......
This diff is collapsed.
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment