I am trying to use (?<!\\)#
to match #
s without a \
in the front (the task is to escape the unescaped #
s in a string). This regex works on several online regex validators. However it doesn't work with the python re
module. I also tried escaping the symbols in the regex, but it either produces errors or does not produce the expected output.
re.sub("(?<!\\)#","\#",'asd\#fh## #')
How can I modify this regex so it can produce the output asd\\#fh\\#\\# \\#
(The output has \
s escaped so there are double \\
)?
CodePudding user response:
You have few issues in your code:
'asd\#fh## #'
is same as'asd#fh## #'
in normal string (unless you use raw string mode)- Likewise
"\#"
in replacement is same as just#
- Similarly
"(?<!\\)#"
will generate regex syntax error as it will become(?<!\)#
without matching)
for negative lookahead
You need to use raw string mode or use double escaping to get it right:
repl = re.sub(r"(?<!\\)#", r"\#", r'asd\#fh## #')
# repl = 'asd\\#fh\\#\\# \\#'