pythonregexargparse

Python argparse regex


Is it possible to use a regex for parsing an argument? For example, I want to accept an argument if only it is a 32 length hex (i.e. matches /[a-f0-9A-F]{32}/)

I tried

p.add_argument('hex', type=str, nargs="[a-f0-9A-F]{32}")

without success


Solution

  • The type keyword argument can take any callable that accepts a single string argument and returns the converted value. If the callable raises argparse.ArgumentTypeError, TypeError, or ValueError, the exception is caught and a nicely formatted error message is displayed.

    import argparse
    import re 
    from uuid import uuid4
    
    def my_regex_type(arg_value, pat=re.compile(r"^[a-f0-9A-F]{32}$")):
        if not pat.match(arg_value):
            raise argparse.ArgumentTypeError("invalid value")
        return arg_value
    
    parser = argparse.ArgumentParser()
    parser.add_argument('hex', type=my_regex_type)
    
    args = parser.parse_args([uuid4().hex])