How to escape special characters of a string with single backslashes

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:

Thank you for visiting the Q&A section on Magenaut. Please note that all the answers may not help you solve the issue immediately. So please treat them as advisements. If you found the post helpful (or not), leave a comment & I’ll get back to you as soon as possible.

Method 1

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)

Method 2

Just assuming this is for a regular expression, use re.escape.

Method 3

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

Method 4

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
>>>

Method 5

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

Method 6

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('\\', '\')


All methods was sourced from stackoverflow.com or stackexchange.com, is licensed under cc by-sa 2.5, cc by-sa 3.0 and cc by-sa 4.0

0 0 votes
Article Rating
Subscribe
Notify of
guest

0 Comments
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
0
Would love your thoughts, please comment.x
()
x