fork download
  1. import re
  2.  
  3. def parse(string):
  4. SCHEME = r"file://" # File prefix
  5. PATH_PATTERN = r"(?P<path>.+?)" # One or more of any character
  6. FLAGS_PATTERN = r"(?P<flags>[^:]+)" # The letters r, w, a, b, a '+' symbol, or any digit
  7.  
  8. # FILE_RESOURCE_PATTERN = SCHEME + PATH_PATTERN + r":" + FLAGS_PATTERN + r"$" # This makes the first test pass, but the second one fail
  9. FILE_RESOURCE_PATTERN = SCHEME + PATH_PATTERN + optional(r":" + FLAGS_PATTERN) + r"$" # This makes the second test pass, but the first one fail
  10.  
  11. tokens = re.match(FILE_RESOURCE_PATTERN, string).groupdict()
  12.  
  13. return tokens['path'], tokens['flags']
  14.  
  15. def optional(re):
  16. '''Encloses the given regular expression in a group which matches 0 or 1 repetitions.'''
  17. return '({})?'.format(re)
  18.  
  19. print(parse("file://foo:bar.txt:r+")) # == ("foo:bar.txt", "r+")
  20. print(parse("file://foobar.txt")) #== ("foobar.txt", None)
  21.  
Success #stdin #stdout 0.01s 23352KB
stdin
Standard input is empty
stdout
('foo:bar.txt', 'r+')
('foobar.txt', None)