Python 在argparse中处理带分隔符的字符串

Python 在argparse中处理带分隔符的字符串,python,argparse,Python,Argparse,我需要将带分隔符的字符串作为参数传递给python脚本。所以,我用 parser.add_argument('--filter', default=None, nargs='*', action="append") 脚本的输入可以是以下任一项: process.py --filter include:a.txt,b.txt exclude:c.txt, d.txt process.py --filter a.txt => This should be considered as in

我需要将带分隔符的字符串作为参数传递给python脚本。所以,我用

parser.add_argument('--filter', default=None, nargs='*', action="append")
脚本的输入可以是以下任一项:

process.py --filter include:a.txt,b.txt exclude:c.txt, d.txt
process.py --filter a.txt   => This should be considered as include:a.txt
process.py --filter include:b.txt --filter exclude:d.txt
process.py --filter exclude:c.txt --filter b.txt
文件a.txt、b.txt、c.txt和d.txt包含一些带有正则表达式模式的字符串

我需要根据关键字(包括/排除)筛选报告。在上面的前两种情况下,过滤后只需要生成一个报告,而在第三种和第四种情况下需要生成两个报告。因此,我需要将给定的输入存储为

Case 1:
filter1 => include => a.txt, b.txt
           exclude => c.txt, d.txt

Case 2:
filter1 => include => a.txt

Case 3:
filter1 => include => b.txt
filter2 => exclude => d.txt

Case 4:
filter1 => exclude => c.txt
filter2 => include => b.txt
如何实现存储上述定义的值


谢谢。

通过你的论证,我得到了命令行

Namespace(filter=[['include:a.txt,b.txt', 'exclude:c.txt,', 'd.txt']])
Namespace(filter=[['a.txt']])
Namespace(filter=[['include:b.txt'], ['exclude:d.txt']])
Namespace(filter=[['exclude:c.txt'], ['b.txt']])
这些值紧密地反映了解析器在sys.argv[1://code>中得到的内容

处理
过滤器
列表应该很容易,以生成所需的值。您不需要在
argparse
中执行更多操作。尝试在
argparse
中执行此操作不会节省任何精力或逻辑

这就是说,我可以想出一些使逻辑更简单的方法

消除
排除:c.txt、d.txt
中的空格。或者在子字符串周围加引号

删除隐式的包含要求

定义两个选项,
--include
--exclude
选项(以及处理隐式“include”的位置选项),而不是一个
--filter
选项:

生产

'a.txt' => 
Namespace(exclude=[], include=[['a.txt']])

'--include a.txt b.txt --exclude c.txt d.txt' =>
Namespace(exclude=[['c.txt', 'd.txt']], include=[['a.txt', 'b.txt'], []])

解析
过滤器
值的简单函数:

def decode(values):
    filters = []
    for f in values:
        filter = {}
        for text in f:
            words = text.split(':')
            if len(words)==1:
                words = ['include']+words
            files = words[1].split(',')
            if words[0] == 'include':
                filter['include'] = files
            elif words[0] == 'exclude':
                filter['exclude'] = files
            else:
                filter['unknown'] = files
        filters.append(filter)
    return filters
它可以用作:

args = parser.parse_args()
filters = decode(args.filter)
为您的4个案例制作:

[{'exclude': ['c.txt', 'd.txt'], 'include': ['a.txt', 'b.txt']}]
[{'include': ['a.txt']}]
[{'include': ['b.txt']}, {'exclude': ['d.txt']}]
[{'exclude': ['c.txt']}, {'include': ['b.txt']}]
我认为唯一遗漏的是处理
exclude:c.txt,d.txt
中的空格。为此,它生成:
[{'exclude':['c.txt',''],'include':['d.txt']}]
。也就是说,它将其解释为隐式的
include


理论上,它可以包含在
--filter
参数的自定义操作中,但我认为它在解析后也可以正常工作。

确实要将过滤器设置为--filter1--filter2等吗?或者一个过滤器列表会更好吗?无论是哪种方式,我都建议研究一下:本节底部有一个自定义操作的示例,这应该使您能够做您想做的事情,通过各种输入查看您在
sys.argv
中得到了什么。你可能需要更多的报价。
[{'exclude': ['c.txt', 'd.txt'], 'include': ['a.txt', 'b.txt']}]
[{'include': ['a.txt']}]
[{'include': ['b.txt']}, {'exclude': ['d.txt']}]
[{'exclude': ['c.txt']}, {'include': ['b.txt']}]