Python 如何生成正则表达式';贪婪但可选';

Python 如何生成正则表达式';贪婪但可选';,python,regex,Python,Regex,我正在尝试为一个表示文件路径的字符串编写一个解析器,可以选择后跟一个冒号(:)和一个表示访问标志的字符串(例如r+或w)。文件名本身可以包含冒号,例如,foo:bar.txt,因此分隔访问标志的冒号应该是字符串中的最后一个冒号 以下是我迄今为止的实施情况: import re def parse(string): SCHEME = r"file://" # File prefix PATH_PATTERN = r"(?P&

我正在尝试为一个表示文件路径的字符串编写一个解析器,可以选择后跟一个冒号(
)和一个表示访问标志的字符串(例如
r+
w
)。文件名本身可以包含冒号,例如,
foo:bar.txt
,因此分隔访问标志的冒号应该是字符串中的最后一个冒号

以下是我迄今为止的实施情况:

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)
问题是,通过使用或不使用
optional
,我可以通过一个或另一个测试,但不能同时通过这两个测试。如果我将
r:“+FLAGS\u模式
设置为可选,则前面的正则表达式将使用整个字符串


如何调整
parse
方法使两个测试都通过?

您应该像

^file://(?P<path>.+?)(:(?P<flags>[^:]+))?$

请参阅。

只是为了好玩,我编写了这个解析函数,我认为它比使用RE好

def parse(string):
    s = string.split('//')[-1]
    try:
        path, flags = s.rsplit(':', 1)
    except ValueError:
        path, flags = s.rsplit(':', 1)[0], None
    return path, flags
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
def parse(string):
    s = string.split('//')[-1]
    try:
        path, flags = s.rsplit(':', 1)
    except ValueError:
        path, flags = s.rsplit(':', 1)[0], None
    return path, flags