我需要一种从字符串中提取标志并将其插入字典的方法。
例如,此字符串:"--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"}
答案 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'}