On Aug 10, 11:10 pm, ssecorp <[EMAIL PROTECTED]> wrote: > If I have an expression like "bob marley" and I want to match > everything with one letter wrong, how would I do? > so "bob narely" and "vob marley" should match etc.
At first, I was going to suggest the brute force solution: ".ob marley|b.b marley|bo. marley|bob.marley|bob .arley|bob m.rley|bob ma.ley|bob mar.ey|bob marl.y|bob marle." But then I realized that after matching the initial 'b', later alternative matches wouldn't need to keep retesting for a leading 'b', so here is a recursive re that does not go back to match previously matched characters: ".ob marley|b(.b marley|o(. marley|b(.marley| (.arley|m(.rley|a(.ley| r(.ey|l(.y|e.))))))))" Here are some functions to generate these monstrosities: base = "bob marley" def makeOffByOneMatchRE(s): return "|".join(s[:i]+'.'+s[i+1:] for i in range(len(s))) re_string = makeOffByOneMatchRE(base) print re_string def makeOffByOneMatchRE(s,i=0): if i==len(s)-2: return '.' + s[-1] + '|' + s[-2] + '.' return '.' + s[i+1:] + '|' + s[i] + '(' + makeOffByOneMatchRE(s,i +1) + ')' re_string = makeOffByOneMatchRE(base) print re_string -- Paul -- http://mail.python.org/mailman/listinfo/python-list