import re
def parse(string):
SCHEME = r"file://" # File prefix
PATH_PATTERN = r"(?P<path>.+?)" # One or more of any character
FLAGS_PATTERN = r"(?P<flags>[^:]+)" # The letters r, w, a, b, a '+' symbol, or any digit
# FILE_RESOURCE_PATTERN = SCHEME + PATH_PATTERN + r":" + FLAGS_PATTERN + r"$" # This makes the first test pass, but the second one fail
FILE_RESOURCE_PATTERN = SCHEME + PATH_PATTERN + optional(r":" + FLAGS_PATTERN) + r"$" # This makes the second test pass, but the first one fail
tokens = re.match(FILE_RESOURCE_PATTERN, string).groupdict()
return tokens['path'], tokens['flags']
def optional(re):
'''Encloses the given regular expression in a group which matches 0 or 1 repetitions.'''
return '({})?'.format(re)
print(parse("file://foo:bar.txt:r+")) # == ("foo:bar.txt", "r+")
print(parse("file://foobar.txt")) #== ("foobar.txt", None)
aW1wb3J0IHJlCgpkZWYgcGFyc2Uoc3RyaW5nKToKICAgIFNDSEVNRSA9IHIiZmlsZTovLyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgRmlsZSBwcmVmaXgKICAgIFBBVEhfUEFUVEVSTiA9IHIiKD9QPHBhdGg+Lis/KSIgICAgICAgICAgICAgICAgICAjIE9uZSBvciBtb3JlIG9mIGFueSBjaGFyYWN0ZXIKICAgIEZMQUdTX1BBVFRFUk4gPSByIig/UDxmbGFncz5bXjpdKykiICAgICAgICAjIFRoZSBsZXR0ZXJzIHIsIHcsIGEsIGIsIGEgJysnIHN5bWJvbCwgb3IgYW55IGRpZ2l0CgogICAgIyBGSUxFX1JFU09VUkNFX1BBVFRFUk4gPSBTQ0hFTUUgKyBQQVRIX1BBVFRFUk4gKyByIjoiICsgRkxBR1NfUEFUVEVSTiArIHIiJCIgICAgICAgICAgICAgICAjIFRoaXMgbWFrZXMgdGhlIGZpcnN0IHRlc3QgcGFzcywgYnV0IHRoZSBzZWNvbmQgb25lIGZhaWwKICAgIEZJTEVfUkVTT1VSQ0VfUEFUVEVSTiA9IFNDSEVNRSArIFBBVEhfUEFUVEVSTiArIG9wdGlvbmFsKHIiOiIgKyBGTEFHU19QQVRURVJOKSArIHIiJCIgICAjIFRoaXMgbWFrZXMgdGhlIHNlY29uZCB0ZXN0IHBhc3MsIGJ1dCB0aGUgZmlyc3Qgb25lIGZhaWwKCiAgICB0b2tlbnMgPSByZS5tYXRjaChGSUxFX1JFU09VUkNFX1BBVFRFUk4sIHN0cmluZykuZ3JvdXBkaWN0KCkKCiAgICByZXR1cm4gdG9rZW5zWydwYXRoJ10sIHRva2Vuc1snZmxhZ3MnXQoKZGVmIG9wdGlvbmFsKHJlKToKICAgICcnJ0VuY2xvc2VzIHRoZSBnaXZlbiByZWd1bGFyIGV4cHJlc3Npb24gaW4gYSBncm91cCB3aGljaCBtYXRjaGVzIDAgb3IgMSByZXBldGl0aW9ucy4nJycKICAgIHJldHVybiAnKHt9KT8nLmZvcm1hdChyZSkKCnByaW50KHBhcnNlKCJmaWxlOi8vZm9vOmJhci50eHQ6cisiKSkgIyA9PSAoImZvbzpiYXIudHh0IiwgInIrIikKcHJpbnQocGFyc2UoImZpbGU6Ly9mb29iYXIudHh0IikpICM9PSAoImZvb2Jhci50eHQiLCBOb25lKQo=