use a regex or not?
Paul McGuire
ptmcg at austin.rr.com
Tue Jun 21 12:17:17 EDT 2005
Here's a hybrid solution, using pyparsing to parse your input pattern
string (p), and transforming it into a regexp string. Then uses
re.match using the regexp to process string (s), and then builds a
dictionary from the matched groups.
Download pyparsing at http://pyparsing.sourceforge.net.
-- Paul
===================
import re
from pyparsing import Word,OneOrMore
previousKeys = []
def createUpperKey(s,l,t):
if t[0] not in previousKeys:
ret = "(?P<%s>.*)" % t[0]
previousKeys.append(t[0])
else:
ret = "(?P=%s)" % t[0]
return ret
lowers = "abcdefghijklmnopqrstuvwxyz"
uppers = lowers.upper()
lowerLetter = Word(lowers,max=1)
upperLetter = Word(uppers,max=1).setParseAction(createUpperKey)
pattern = OneOrMore( lowerLetter | upperLetter )
def fill(s,p):
# reset keys found in p-patterns
del previousKeys[:]
# create regexp by running pyparsing transform
regexp = pattern.transformString(p) + "$"
# create dict from re-matched groups
match = re.match(regexp,s)
if match:
ret = dict( [ (k,match.group(k)) for k in previousKeys ] )
else:
ret = dict()
return ret
tests = [
('ab','aA'),
('ab','Ab'),
('bb','Aa'),
('aa','Aa'),
('aa','Ab'),
('abb','aA'),
('aba','aAa'),
('abbba','aAa'),
('abbbaba','aAa'),
('abb','aAa'),
('abab','aAaA'),
('abac','aAaA'),
('abac','aAaB'),
]
for t in tests:
print t,fill( *t )
================
Gives:
('ab', 'aA') {'A': 'b'}
('ab', 'Ab') {'A': 'a'}
('bb', 'Aa') {}
('aa', 'Aa') {'A': 'a'}
('aa', 'Ab') {}
('abb', 'aA') {'A': 'bb'}
('aba', 'aAa') {'A': 'b'}
('abbba', 'aAa') {'A': 'bbb'}
('abbbaba', 'aAa') {'A': 'bbbab'}
('abb', 'aAa') {}
('abab', 'aAaA') {'A': 'b'}
('abac', 'aAaA') {}
('abac', 'aAaB') {'A': 'b', 'B': 'c'}
More information about the Python-list
mailing list