从字符串

时间:2018-05-27 17:27:10

标签: python

我需要一种从字符串中提取标志并将其插入字典的方法。

例如,此字符串:"--test arg1 arg2 --test2"将为{"test":"arg1 arg2", "test2":None}。它也应该与-而不是--一起使用,因此"--test -test2 --test3 arg arg arg"

我尝试使用argparse,但我停止使用它,因为我没有调用SystemExit。

我也尝试使用shlex.split(content),但它需要参数在'',所以我仍然需要使用循环来改变它。

是否有一些模块可以做到这一点?我看着点子,找不到这样的东西。但我知道必须存在这样的事情。

谢谢!

编辑:第二个示例应解析为{"test":None, "test2":None, "test3": "arg arg arg"}

3 个答案:

答案 0 :(得分:2)

您可以使用re模块执行此操作:

import re
s = "--test -test2 --test3 arg arg arg -test4"

print({m.group(1): m.group(2) or None for m in re.finditer(r"--?(\w+)(?: ([^-]*)|$)", s)})

打印:

{'test': None, 'test2': None, 'test3': 'arg arg arg ', 'test4': None}

说明:

  • --?一两个-
  • (\w+)保存在第一组中的任何单词字符组合([a-zA-Z0-9_]
  • (?: ([^-]*)|$)一个由(|)组成的匿名组
    • ([^-]*)保存在第二组中的任意数量的无-
    • $字符串的结尾(在这种情况下,第二组为空)

答案 1 :(得分:2)

您可以使用以下函数使用正则表达式来解析字符串中的标志:

In [17]: def flag_parser(string):
    ...:     return {i[1]:i[2].strip() if i[2].strip() else None for i in re.findall(r'(-{1,2})(\w+) ([a-zA-Z0-9 ]*)', string)}
    ...: 

In [18]: flag_parser("--test -test2 --test3 arg arg arg")
Out[18]: {'test': None, 'test2': None, 'test3': 'arg arg arg'}

正则表达式的解释:

re.findall(r'(-{1,2})(\w+) ([a-zA-Z0-9 ]*)', string)

re.findall - 查找并返回所有匹配项的列表。

(-{1,2}) - 出现一两次-

(\w+) - 匹配一个或多个长度的单词

([a-zA-Z0-9 ]*) - 匹配参数

答案 2 :(得分:0)

另一种方法是拆分:

mystring = '--test arg1 arg2 --test2 --test3 arg1'

mydict = {}

for x in mystring.split('--'):
    if 'test' in x.split(' ')[0]:
        mydict[x.split(' ')[0]] = ''.join(x.split(' ')[1:])

print(mydict)

#output

{'test': 'arg1 arg2 ', 'test2': '', 'test3': 'arg1'}