如何在Python字符串中转义任何特殊的shell字符?

12

我该如何在Python字符串中转义任意特殊的shell字符?

以下字符需要被转义:

$,!,#,&,",',(,),|,<,>,`,\,;

例如,假设我有这个字符串:

str="The$!cat#&ran\"'up()a|<>tree`\;"

TIA


2
你想要做什么? - Padraic Cunningham
2
这个字符串只是作为一个字符串使用吗(在这种情况下,这不是一个问题),还是会传递给一些 shell 命令? - smci
3
离题了:请不要将变量命名为 str。这会遮蔽内置的 str 类。 - 5gon12eder
它被传递到一个shell脚本中,我这里只是使用了str,实际的脚本名称不同。 - Sam Roberts
编辑队列已满?不知道他们是否都在尝试移动“TIA”。另外,shlex的答案应该被接受。即使OP在2015年使用Python2,现在在2021年也不应该这样做。 - Phil
3个回答

24

在Python3中,所需的工具已经被包含在shlex.quote中。

shlex.quote(s)

返回字符串s的shell转义版本。返回值是一个字符串,可以安全地用作shell命令行中的一个标记。[...]

import shlex

s = "The$!cat#&ran\"'up()a|<>tree`\;"
print(shlex.quote(s))

输出:

'The$!cat#&ran"'"'"'up()a|<>tree`\;'

1
shlex.quote 仅适用于 Python3。 - Padraic Cunningham
1
Python 2.7 的相等函数是 pipes.quote,在 Python 3 中与 shlex.quote 相同。 - Lukas Graf
@SamRoberts,你实际上想要做什么? - Padraic Cunningham
1
实际上,pipes.quote没有转义这5个字符:! $ ' " `。有什么想法吗? - Sam Roberts

3

re.sub可以完成这项工作:

re.sub("(!|\$|#|&|\"|\'|\(|\)|\||<|>|`|\\\|;)", r"\\\1", astr)

输出

The\$\!cat\#\&ran\"\'up\(\)a\|\<\>tree\`\\\;

2

不确定为什么您想要转义所有内容而不是尽可能多地引用,但是这样做可以解决问题(如果需要,请将'@'替换为字符串中不存在的另一个字符):

>>> escape_these = r'([$!#&"()|<>`\;' + "'])"
>>> print(re.sub(escape_these, r'@\1', s).replace('@','\\'))
The\$\!cat\#\&ran\"\'up\(\)a\|\<\>tree\`\\;

这可能需要稍微减少转义技巧,但不幸的是,字符串、re和shell都使用\(反斜杠)进行转义和其他特殊用途,这确实使事情有些复杂 :-).


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接