正则表达式解析命令行字符串但不在引号

时间:2016-11-04 19:44:55

标签: regex python-2.7

我正在使用python来解析由optparse模块传入的字符串。 我想在某些分隔符上拆分字符串,但不在引号之间。 示例字符串是:

--state-basedir /dir/dir/dir/ --cmd=\"param load $v2param\" --master=/dev/ttyUSB0 --console --map --out=udp:192.168.1.1:14550

这个字符串作为单个optparse参数传入,然后我将它传递给另一个进程。 我一直在http://pythex.org/尝试各种各样的事情 我得到的最接近的是:

`(?<!")[\s=](?![\s0-9a-zA-Z\$\\]*")`

问题是=之后的--cmd符号与--master之前的空格不匹配。

用简单的英语,这就是我正在阅读我的正则表达式:

  

匹配空格字符或相同字符,只要它不带引号,并且只要它不是由任何其他字母,数字,标点的组合继续进行的另一个引号

我有一种感觉,那就是我缺少的其他东西,比如贪婪,所以我尝试在我的前瞻和后视条件之后添加?。如果我在?之后放置--master,我可以在?之前获得空格,但如果我在我的预测期后放Scanner input = new Scanner(System.in); int a = 0; while (true) { System.out.print("enter a number: "); if (!input.hasNextInt() || !input.hasNext() || (a < 1 || a > 3)) { System.out.println("Oops! "); input.nextLine(); } else { a = input.nextInt(); break; } } input.close(); System.out.println("a = " + a); } ,我会在引号中找到空格现在,我不想要。

这里的想法是我将使用re.split来处理事情。

感谢您对我做错的任何解释。

1 个答案:

答案 0 :(得分:0)

这不是一个正则表达式的答案,它也不漂亮,但它只有一行。

 sum([[x] if '"' in x else re.split(' |=',x) for x in re.split('=(\".+?\" )',a)],[])

输出:

['--state-basedir', '/dir/dir/dir/', '--cmd', '"param load $v2param" ', '--master', '/dev/ttyUSB0', '--console', '--map', '--out', 'udp:192.168.1.1:14550']

re.split('=(\".+?\" )',a)]开始,这会拆分引号括起来的文字(更具体地说是="something another thing")。然后,如果分割的片段中没有re.split(' |=',x),则会使用"进一步拆分,或者如果他们这样做,则按[x]返回。最后一步是通过使用sum重载sum(two_d_list,[])来折叠生成的二维列表。

我希望这个答案有所帮助但我明白这不是你想要的