我正在尝试构建一个脚本需要来自' grep'在linux shell中
但是,我发现Python sys.argv从命令行转义了我的正则表达式模式
例如,我将通过' \ d'作为命令行的grep模式。
但是sys.argv [1]返回的字符串被转义为' \\ d'
我在调试模式下进行了以下测试:
#SyntaxTest.py
import sys
#other stuff preventing my debugger from stopping after importing
#shell
python3 -m pdb SyntaxTest.py '\d'
> /cygdrive/d/PythonSandBox/SyntaxTest.py(1)<module>()
-> import sys
(Pdb) n
(Pdb) sys.argv[1]
'\\d'
(Pdb) print(sys.argv[1])
\d
我想知道为什么Python需要逃避我的命令行参数,我想要一种方法来获得一个简单的,未转义的字符串。
令人印象深刻的是&#39; \\ d&#39; ==&#39; \ d&#39;。
但在我的情况下,我需要像这样将字符串传递给子进程。
>>> pattern = '\d'
>>> str = r"echo '%s'"%pattern
>>> str
"echo '\\d'"
>>> subprocess.check_output(str,shell=True)
b'\\d\n'
很明显,\\ d已经传递给shell。但是,我需要它只是\ d而不是\\ d。除了手动替代之外还有什么方法吗?
答案 0 :(得分:2)
这就是Python解释器打印字符串的方式。您的print
来电显示字符串未真正转义。
>>> '\d'
'\\d'
>>> '\\d'
'\\d'
>>> print('\d')
\d
>>> print('\\d')
\d
另请注意,'\d'
和'\\d'
是编写相同字符串的两种方式。
>>> '\d' == '\\d'
True
答案 1 :(得分:2)
Python没有转义你的shell参数。这是反斜杠字符的表示方式,因为反斜杠是转义字符,因此为了在字符串中字面用,必须对其进行转义。
例如,您必须知道print '\n'
将打印换行符
// Python REPL:
>>> print 'a\nb'
a
b
如果要打印文字 \ n 字符串,则必须使用另一个反斜杠转义反斜杠字符:
// Python REPL:
>>> print 'a\\nb'
a\nb
因此,加倍反斜杠只是在Python字符串中表示文字反斜杠的方式(我猜几乎所有的编程语言都是如此,因为这是一种标准)。