argparse多个可选参数

时间:2019-05-29 06:40:50

标签: python

我正在编写一个脚本,该脚本在一个或多个输入文件中搜索正则表达式。如果没有提供输入文件(或者有"-"而不是文件),则应在stdin中进行搜索。

示例:myscript.py [-h] [-u | -c | -m] [infile [infile ...]] regex

我不明白的是-它如何区分文件名和正则表达式? 假设我输入了myscript.py file1 file2 regex。怎么知道regex是一个正则表达式而不是另一个文件?

我的代码如下:

def init_parser():
  parser = argparse.ArgumentParser(
    description="The script searches one or more named input files for lines\
     containing a match to a regular expression pattern."
  )
  parser.add_argument(
    '-f','--infile', nargs='*', type=argparse.FileType('r'), default='-',
    help='the name of the file(s) to search.'
  )
  parser.add_argument('regex', help='the regular expression.')
  group = parser.add_mutually_exclusive_group()
  group.add_argument(
    '-u', '--underscore', action='store_true', 
    help='prints "^" under the matching text.'
  )
  group.add_argument(
    '-c', '--color', action='store_true', 
    help='highlights matching text.'
  )
  group.add_argument(
    '-m', '--machine', action='store_true', 
    help='generates machine readable output.'
  )

  return parser

由于没有用于指定正则表达式的标志,因此脚本无法区分文件和正则表达式。如果我没有指定文件(因为我想从stdin中读取文件),它会认为我的正则表达式是文件,并且失败。

1 个答案:

答案 0 :(得分:0)

假设您在命令行上始终有一个正则表达式,如果先放置正则表达式参数,然后再输入infile,则将使用您指定的其他位置参数:

parser.add_argument('regex', help='the regular expression.')
parser.add_argument('infile', nargs='*', type=argparse.FileType('r'), help='the name of the file(s) to search.')