【问题标题】:Match first word and arguments with optional parameters, quoted or not将第一个单词和参数与可选参数匹配,无论是否引用
【发布时间】:2015-08-20 22:14:32
【问题描述】:

所有,我正在尝试解析来自具有以下特征的用户指令(存储为单行字符串):

  1. 第一个单词是命令 - 不允许有空格,但可以有前导或尾随空格,具体取决于用户的纪律性
  2. 命令后的可选参数,用逗号或空格(或两者)分隔参数
  3. 双引号中的输入被视为单个参数,因此双引号内的逗号不用于分隔参数(用于创建列表)。

输入和所需解析的示例(显示为字典);单引号开始和结束示例,并且不是要解析的字符串的一部分..:

'start'                       
{'cmd':'start'}
'  stop     '                
{'cmd':'stop'}
'start now'                   
{'cmd':'start','arg1':'now'}
' start     later   forward ,  back    ' 
{'cmd':'start','arg1':'later','arg2':'forward','arg3':'back}
'start    tomorrow  ,back, "Lucile,   Michael "    Oscar'
{'cmd':'start','arg1':tomorrow','arg2':'back','arg3':'Lucile,   Michael','arg4':'Oscar'}

我在 PY3.4 上,但关键问题是 RegEx,不需要特定于 python 的实现。

【问题讨论】:

  • 澄清一下,您是想将其作为命令行参数还是(我认为这就是您的意思)作为用户通过input() 之类的字符串输入?是否有必要在双引号参数中允许转义双引号?
  • 我的python变量是一个字符串,没有使用input();另外,出于好奇,无论如何 input() 不会返回字符串吗?不允许转义双引号。

标签: python regex


【解决方案1】:

单个正则表达式可能更困难,因为看起来您可能想要处理任意数量的参数。您可以使用此函数以上面给出的格式提取命令和参数:

import re

def parse(s):
  args = {}
  n = 1
  # recognizes a double-quoted argument
  q_arg_re = "^\s*,?\s*\"(.*?)\""
  # recognizes a single-word argument
  arg_re = "^\s*,?\s*(\w+)"
  arg = False
  while True:
    m = re.search(arg_re, s)
    if m:
      arg = m.groups()[0]
    else:
      m = re.search(q_arg_re, s)
      if m:
        arg = m.groups()[0]

    if arg:
      if 'cmd' in args:
        args['arg{}'.format(n)] = arg
        n += 1
      else:
        args['cmd'] = arg
      s = s[m.end(0):]
      arg = False
    else:
      break
  return args

【讨论】:

    【解决方案2】:

    您应该考虑为 python argparse 或optparse

    【讨论】:

    • 抱歉,编辑了问题以澄清混淆,这不是“命令行”解析器 - 我的意思是用户的输入是单行,存储为字符串变量,这里没有 sys.argv ,所以 argparse 并没有真正的帮助。
    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 2016-11-19
    • 2012-08-08
    • 2019-10-30
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    相关资源
    最近更新 更多