Skip to main content
 首页 » 编程设计

python之Argparse:基于正则表达式区分参数

2024年09月03日36artech

是否可以根据带有 argparse 的正则表达式来区分参数?

我希望我的脚本接受 IP 地址或网络地址,但需要能够区分这两者,因为后端 API 调用需要我指定使用哪个地址。 我最好不要使用显式标志来指定使用哪个参数,而是使用正则表达式,但不确定这是否可能?

示例用法:

ip-lookup.py 192.168.1.1 

192.168.1.1 应该分配给名为“ip”的参数

ip-lookup.py 192.168.0.0/16 
ip-lookup.py 192.168.0.0 255.255.0.0 
ip-lookup.py 192.168.0.0/255.255.0.0 

192.168.0.0/16 应该分配给名为“network”的参数

代码:

parser = argparse.ArgumentParser(description='Lookup an IP address or network in the backend IPAM system.') 
parser.add_argument('ip', help='IP host address', type=str, required=False, **regex to match on IP address**) 
parser.add_argument('network', help='IP network address', type=str, required=False, **regex to match on IP network**) 
 
args = parser.parse_args() 
 
args.ip         -> should only exist if the user entered an IP address as parameter 
args.network    -> should only exist if the user entered an IP network as parameter 

请您参考如下方法:

我会通过定义非位置参数(定义时在它们前面的 -- )来解决这个问题。例如

import argparse 
parser = argparse.ArgumentParser() 
 
parser.add_argument('--ip', help='IP host address', type=str, required=False) 
parser.add_argument('--network', help='IP network address', type=str, required=False) 
 
args = parser.parse_args() 
 
print(getattr(args, 'ip')) 
print(getattr(args, 'network')) 

现在您可以使用 test.py --ip 192.168.1.1 或 test.py --network 192.168.0.0/255.255.0.0 调用它。这将分别返回:

192.168.1.1 
None 

或

None 
192.168.1.1/255.255.0.0 

请注意,如果字符串包含空格,则需要 --network '192.168.1.1 255.255.0.0'。