Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import re
- import string
- def traverse(tree):
- retval = ''
- for node in tree:
- if node[0] == 'any':
- retval += 'x'
- elif node[0] == 'at':
- pass
- elif node[0] in ['min_repeat', 'max_repeat']:
- retval += traverse(node[1][2]) * node[1][0]
- elif node[0] == 'in':
- if node[1][0][0] == 'negate':
- letters = list(string.ascii_letters)
- for part in node[1][1:]:
- if part[0] == 'literal':
- letters.remove(chr(part[1]))
- else:
- for letter in range(part[1][0], part[1][1]+1):
- letters.remove(chr(letter))
- retval += letters[0]
- else:
- if node[1][0][0] == 'range':
- retval += chr(node[1][0][1][0])
- else:
- retval += chr(node[1][0][1])
- elif node[0] == 'not_literal':
- if node[1] == 120:
- retval += 'y'
- else:
- retval += 'x'
- elif node[0] == 'branch':
- retval += traverse(node[1][1][0])
- elif node[0] == 'subpattern':
- retval += traverse(node[1][1])
- elif node[0] == 'literal':
- retval += chr(node[1])
- return retval
- print traverse(re.sre_parse.parse(regex).data)
- In [1]: import re
- In [2]: a = re.sre_parse.parse("[abc]+[def]*d?z")
- In [3]: a
- Out[3]: [('max_repeat', (1, 65535, [('in', [('literal', 97), ('literal', 98), ('literal', 99)])])), ('max_repeat', (0, 65535, [('in', [('literal', 100), ('literal', 101), ('literal', 102)])])), ('max_repeat', (0, 1, [('in', [('category', 'category_digit')])])), ('literal', 122)]
- In [4]: eval(str(a))
- Out[4]:
- [('max_repeat',
- (1, 65535, [('in', [('literal', 97), ('literal', 98), ('literal', 99)])])),
- ('max_repeat',
- (0,
- 65535,
- [('in', [('literal', 100), ('literal', 101), ('literal', 102)])])),
- ('max_repeat', (0, 1, [('in', [('category', 'category_digit')])])),
- ('literal', 122)]
- In [5]: a.dump()
- max_repeat 1 65535
- in
- literal 97
- literal 98
- literal 99
- max_repeat 0 65535
- in
- literal 100
- literal 101
- literal 102
- max_repeat 0 1
- in
- category category_digit
- literal 122
- import re
- class REParser(object):
- """Parses an RE an gives the least greedy value that would match it"""
- def parse(self, parseInput):
- re.compile(parseInput) #try to parse to see if it is a valid RE
- retval = ""
- stack = list(parseInput)
- lastelement = ""
- while stack:
- element = stack.pop(0) #Read from front
- if element == "\":
- element = stack.pop(0)
- element = element.replace("d", "0").replace("D", "a").replace("w", "a").replace("W", " ")
- elif element in ["?", "*"]:
- lastelement = ""
- element = ""
- elif element == ".":
- element = "a"
- elif element == "+":
- element = ""
- elif element == "{":
- arg = self._consumeTo(stack, "}")
- arg = arg[:-1] #dump the }
- arg = arg.split(",")[0] #dump the possible ,
- lastelement = lastelement * int(arg)
- element = ""
- elif element == "[":
- element = self._consumeTo(stack, "]")[0] # just use the first char in set
- if element == "]": #this is the odd case of []<something>]
- self._consumeTo(stack, "]") # throw rest away and use ] as first element
- elif element == "|":
- break # you get to an | an you have all you need to match
- elif element == "(":
- arg = self._consumeTo(stack, ")")
- element = self.parse( arg[:-1] )
- retval += lastelement
- lastelement = element
- retval += lastelement #Complete the string with the last char
- return retval
- def _consumeTo(self, stackToConsume, endElement ):
- retval = ""
- while not retval.endswith(endElement):
- retval += stackToConsume.pop(0)
- return retval
Add Comment
Please, Sign In to add comment