Klaus
Klaus

Reputation: 1251

Matching \[\] in Python regexes

I am trying to replace all expressions of the form

\[something\]

in a string by

\[<img src='something'>\]

Since \ and [ ] are special characters, I need to espace them (so \\, \[ and \]), thus my code would be

def repl(m):
    return "<img src='"+m.group(1)+"'>"

print re.sub("\\\[(.*?)\\\]", repl, "frfrfr\nfrrffr<p>\[something\]</p>frff\nfrfrr", re.S)

However, this returns the original string. Could someone point out my mistake ?

Upvotes: 2

Views: 292

Answers (1)

falsetru
falsetru

Reputation: 369224

Escape \ correctly, or use r'raw string' as follow.

>>> print re.sub(r"\\\[(.*?)\\\]", repl, "frfrfr\nfrrffr<p>\[something\]</p>frff\nfrfrr", flags=re.S)
frfrfr
frrffr<p><img src='something'></p>frff
frfrr

>>> print re.sub("\\\\\\[(.*?)\\\\\\]", repl, "frfrfr\nfrrffr<p>\[something\]</p>frff\nfrfrr", flags=re.S)
frfrfr
frrffr<p><img src='something'></p>frff
frfrr

UPDATE

The fourth parameter of re.sub is count, not flags. To specify flags, use keyword arguments. Otherwise, re.S is recognized as count.

>>> print re.sub(r"\\\[(.*?)\\\]", repl, "frfrfr\nfrrffr<p>\[something\nblah\]</p>frff\nfrfrr", re.S)
frfrfr
frrffr<p>\[something
blah\]</p>frff
frfrr
>>> print re.sub(r"\\\[(.*?)\\\]", repl, "frfrfr\nfrrffr<p>\[something\nblah\]</p>frff\nfrfrr", flags=re.S)
frfrfr
frrffr<p><img src='something
blah'></p>frff
frfrr

Upvotes: 5

Related Questions