Wildcards for regexps?

Paul McGuire ptmcg at austin.rr.com
Mon Aug 11 06:56:08 CEST 2008


On Aug 10, 11:10 pm, ssecorp <circularf... at gmail.com> 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



More information about the Python-list mailing list