How to escape special characters of a string with single backslashes
Question:
I’m trying to escape the characters -]^$*.
each with a single backslash
.
For example the string: ^stack.*/overflow$arr=1
will become:
^stack.*/overflo\w$arr=1
What’s the most efficient way to do that in Python?
re.escape
double escapes which isn’t what I want:
'\^stack\.\*\/overflow\$arr\=1'
I need this to escape for something else (nginx).
Answers:
This is one way to do it (in Python 3.x):
escaped = a_string.translate(str.maketrans({"-": r"-",
"]": r"]",
"\": r"\",
"^": r"^",
"$": r"$",
"*": r"*",
".": r"."}))
For reference, for escaping strings to use in regex:
import re
escaped = re.escape(a_string)
Just assuming this is for a regular expression, use re.escape
.
Simply using re.sub
might also work instead of str.maketrans
. And this would also work in python 2.x
>>> print(re.sub(r'(-|]|^|$|*|.|\)',lambda m:{'-':'-',']':']','\':'\\','^':'^','$':'$','*':'*','.':'.'}[m.group()],"^stack.*/overflow$arr=1"))
^stack.*/overflo\w$arr=1
Utilize the output of built-in repr
to deal with rnt
and process the output of re.escape
is what you want:
re.escape(repr(a)[1:-1]).replace('\\', '\')
re.escape
doesn’t double escape. It just looks like it does if you run in the repl. The second layer of escaping is caused by outputting to the screen.
When using the repl, try using print
to see what is really in the string.
$ python
>>> import re
>>> re.escape("^stack.*/overflo\w$arr=1")
'\\\^stack\\\.\\\*\/overflo\\w\\\$arr\=1'
>>> print re.escape("^stack.*/overflo\w$arr=1")
\^stack\.\*/overflo\w\$arr=1
>>>
We could use built-in function repr()
or string interpolation fr'{}'
escape all backwardslashs
in Python 3.7.*
repr('my_string')
or fr'{my_string}'
Check the Link: https://docs.python.org/3/library/functions.html#repr
I’m trying to escape the characters -]^$*.
each with a single backslash .
For example the string: ^stack.*/overflow$arr=1
will become:
^stack.*/overflo\w$arr=1
What’s the most efficient way to do that in Python?
re.escape
double escapes which isn’t what I want:
'\^stack\.\*\/overflow\$arr\=1'
I need this to escape for something else (nginx).
This is one way to do it (in Python 3.x):
escaped = a_string.translate(str.maketrans({"-": r"-",
"]": r"]",
"\": r"\",
"^": r"^",
"$": r"$",
"*": r"*",
".": r"."}))
For reference, for escaping strings to use in regex:
import re
escaped = re.escape(a_string)
Just assuming this is for a regular expression, use re.escape
.
Simply using re.sub
might also work instead of str.maketrans
. And this would also work in python 2.x
>>> print(re.sub(r'(-|]|^|$|*|.|\)',lambda m:{'-':'-',']':']','\':'\\','^':'^','$':'$','*':'*','.':'.'}[m.group()],"^stack.*/overflow$arr=1"))
^stack.*/overflo\w$arr=1
Utilize the output of built-in repr
to deal with rnt
and process the output of re.escape
is what you want:
re.escape(repr(a)[1:-1]).replace('\\', '\')
re.escape
doesn’t double escape. It just looks like it does if you run in the repl. The second layer of escaping is caused by outputting to the screen.
When using the repl, try using print
to see what is really in the string.
$ python
>>> import re
>>> re.escape("^stack.*/overflo\w$arr=1")
'\\\^stack\\\.\\\*\/overflo\\w\\\$arr\=1'
>>> print re.escape("^stack.*/overflo\w$arr=1")
\^stack\.\*/overflo\w\$arr=1
>>>
We could use built-in function repr()
or string interpolation fr'{}'
escape all backwardslashs in Python 3.7.*
repr('my_string')
or fr'{my_string}'
Check the Link: https://docs.python.org/3/library/functions.html#repr