正则表达式被剥离'\';当作为python脚本的命令行参数提供时

正则表达式被剥离'\';当作为python脚本的命令行参数提供时,python,regex,command-line,Python,Regex,Command Line,我正在编写一个脚本,需要在命令行上指定正则表达式。所以程序应该能够在命令行中执行\d+,如下所示: python3 my_script.py \d+ 假设my_script.py根据命令行中给定的正则表达式搜索某些文件 但是当我这样做的时候,前面的\就被去掉了。因此,打印sys.argv具有['my_script.py','d+'] 如何使命令行上指定的正则表达式保持原样?请注意正则表达式不在引号中。有可能吗 (我正在使用getopt模块处理输入参数)您可能应该使用两个反斜杠: python3

我正在编写一个脚本,需要在命令行上指定正则表达式。所以程序应该能够在命令行中执行
\d+
,如下所示:

python3 my_script.py \d+
假设my_script.py根据命令行中给定的正则表达式搜索某些文件

但是当我这样做的时候,前面的
\
就被去掉了。因此,打印sys.argv
具有
['my_script.py','d+']


如何使命令行上指定的正则表达式保持原样?请注意正则表达式不在引号中。有可能吗


(我正在使用getopt模块处理输入参数)

您可能应该使用两个反斜杠:

python3 my_script.py \\d+


要正确读取字符串文字中的反斜杠,需要对其进行转义或引用。

您可能应该使用两个反斜杠:

python3 my_script.py \\d+


要正确读取字符串文字中的反斜杠,需要对其进行转义或引用。

命令行shell“吃”反斜杠字符,因为它要解释转义代码(C样式)。@Thawn:不,它不吃。您将字符串的
repr
表示与字符串的实际内容混淆了。@schwobasegll@Peter。谢谢,这个解决方案有效。但我想问的是,如果我传递任何正则表达式,比如
\\d{10,20}
,那么它会像['my_script.py'、'\\d10'、'\\d20']那样分解它。为什么会这样?@mkike是的,可能带引号的版本更灵活。谢谢。也许我会做。如果有人做过这样的事,等待着命令行shell“吃”反斜杠字符,因为它想解释转义码(C样式)。@Thawn:不,它不吃。您将字符串的
repr
表示与字符串的实际内容混淆了。@schwobasegll@Peter。谢谢,这个解决方案有效。但我想问的是,如果我传递任何正则表达式,比如
\\d{10,20}
,那么它会像['my_script.py'、'\\d10'、'\\d20']那样分解它。为什么会这样?@mkike是的,可能带引号的版本更灵活。谢谢。也许我会做。如果有人做过这样的事,等待着“请注意正则表达式不在引号中”-好吧,为什么不呢?您需要用单引号将其包装起来,以阻止shell对其进行预处理。这是在grep中指定正则表达式的要求。格雷普也没有引用。虽然字符类的指定方式不同,但如果您尝试在名称以
a
开头的文件目录中grep查找regex
a*
,您会感到意外。Shell预处理对grep的作用与对任何其他程序的作用相同。只有在正则表达式中没有任何shell会弄乱的东西时,才可以不加引号。“请注意正则表达式不加引号”-好吧,为什么不加引号?您需要用单引号将其包装起来,以阻止shell对其进行预处理。这是在grep中指定正则表达式的要求。格雷普也没有引用。虽然字符类的指定方式不同,但如果您尝试在名称以
a
开头的文件目录中grep查找regex
a*
,您会感到意外。Shell预处理对grep的作用与对任何其他程序的作用相同。只有在正则表达式中没有任何shell会弄乱的东西时,才可以不使用引号。