【问题标题】:How to parse a valid IP4/IPV6 address using optparse in python?如何在 python 中使用 optparse 解析有效的 IP4/IPV6 地址?
【发布时间】:2018-05-10 22:39:38
【问题描述】:

就像我想解析 127.0.0.1 一样,它可以正确解析,但 127.0.a.1 不是有效的 IP 地址,所以它应该会抛出错误。如何在 python 中使用 optparse 来做到这一点?

喜欢解析我们使用的整数或字符串值

parser.add_option("-n", action="store", type="int", dest="number")

但是为了解析一个有效的 IP 地址,我们应该写什么?

【问题讨论】:

  • 你能用正则表达式检查吗?
  • @JamesLingham 我应该使用什么线。你能帮我吗?
  • 您的情况可能的正则表达式可能是r'\d{3}(\.\d){3}',这意味着检查 3 位数字,然后是 3 次点,后跟一个数字。
  • 我建议换成 argparse 而不是使用 optparse。为了坚持使用 optparse,我链接的问题中解释的类型检查必须按照此处详述的步骤执行:docs.python.org/2/library/optparse.html#extending-optparse
  • 我们可以使用回调来验证吗?

标签: python python-2.7 optparse


【解决方案1】:

我认为使用这个section of the optparse documentation,这个SO answer(它使用argparse解决完全相同的问题)可以适应optparse。

思路基本如下:

  1. 定义一个函数来检查输入是否满足给定条件(逻辑已经在 argparse 答案中完成,结构在我链接的 optparse 文档中)
  2. 为 type optparse 参数定义一个新选项。
  3. 将此用户定义类型用于 IP 参数

因此,代码如下所示:

from copy import copy
from optparse import OptionParser, Option, OptionValueError 
import re

# define checker function
def check_ip(option, opt, value):
    try:
        return re.match(r'(\d{3}(\.\d){3})', value).group(0) # I added some 
        # parethesis to the comment in order to define the IP as group(0)
    except: # I think re.match().group() would raise an AttributeError, check it
        raise OptionValueError(
            "option %s: invalid IP value: %r" % (opt, value))

# define new optparse option
class MyOption(Option):
    TYPES = Option.TYPES + ("IP",)
    TYPE_CHECKER = copy(Option.TYPE_CHECKER)
    TYPE_CHECKER["IP"] = check_ip

# use optparser with the new option
parser = OptionParser(option_class=MyOption)
parser.add_option("-c", type="IP")

评论

检查您从re.match 得到的错误,然后写except <error_type>。捕获任何异常并不是一个好习惯(参见Why is "except: pass" a bad programming practice?)。

还可以考虑使用argparse 而不是 optparse,两者都适用于 python2.7。 Why use argparse rather than optparse?

【讨论】:

  • 嗨,是的,我遇到了一个错误。如果我尝试传递任何 IP,如 192.168.10.10 或任何 ip 值,它会显示无效 ip 错误。示例:python eg1.py -c 12.12.12.12 用法:eg1.py [options] eg1.py: error: option -c: invalid IP value: '12.12.12.12' 我应该对代码进行哪些更改?
  • 正则表达式检查 3 位数字,然后是 3 次包(点后跟数字)。它应该接受什么?中间有 3 个点的任意位数?
  • 您也可以查看此问题stackoverflow.com/questions/22937618/… 或本教程medium.com/factory-mind/… 并检查它们是否适用于您的所有案例regex101.com 正则表达式真的很有用
  • 例如,您可能想尝试r'((\d+\.){3}\d+)',它与模式匹配:3 次包装(数字 1 次或多次后跟点)然后数字 1 次或多次
  • 谢谢先生,是的,它工作得很好。我清楚地了解 IP 正则表达式的使用。现在我想尝试使用 argparse 而不是 optparse 进行 IP 地址解析。能否请任何链接,以便我可以尝试?
猜你喜欢
  • 2013-02-28
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
  • 2012-12-25
  • 2018-06-29
  • 1970-01-01
  • 2011-06-15
  • 1970-01-01
相关资源
最近更新 更多