r1chardj0n3s/parse

Match on empty string

Opened this issue · 2 comments

I'm trying to match urls with the following pattern:

'/{url1}'

which matches '/foo' but not '/', even though '/{url1}'.format(url1='') would equal '/'.

Could this be a configurable option?

HINT:
That is basically the case of an optional<T> item (or by using choice(s)).
You can already solve that yourself by using user-defined types (or: by using parse_type).

SEE ALSO:

OR: Use cardinality field support, like:

# -- USE CASE: Parser with CardinalityField support.
# NOTE: Automatically adds missing type variants with CardinalityField part.
from parse_type.cfparse import Parser  # DROP-IN REPLACEMENT: Parser w/ CardinalityField support
from parse import with_pattern

@with_pattern(r"\d+")
def parse_number(text):
    return int(text)

# -- PREPARE: parser, adds missing type variant for cardinality 0..1 (optional) and other cardinalities.
type_dict = dict(Number=parse_number)
parser = Parser("OptionalNumber: {number:Number?}", type_dict)

# -- USE: parser.
result1 = parser.parse("OptionalNumber: 42")
assert result1["number"] == 42
result2 = parser.parse("OptionalNumber: ")
assert result1["number"] == None