Python 在PyParsing中,如何阻止正则表达式使用整个字符串

Python 在PyParsing中,如何阻止正则表达式使用整个字符串,python,regex,pyparsing,Python,Regex,Pyparsing,我试图编写一个函数parse,例如 assert parse("file://foo:bar.txt:r+") == ("foo:bar.txt", "r+") 该字符串由一个固定前缀file://、一个文件名(可以由一个或多个字符组成)以及一个冒号和一个表示访问标志的字符串组成 下面是一个使用正则表达式的实现: import re def parse(string): SCHEME = r"file://" # File pr

我试图编写一个函数
parse
,例如

assert parse("file://foo:bar.txt:r+") == ("foo:bar.txt", "r+")
该字符串由一个固定前缀
file://
、一个文件名(可以由一个或多个字符组成)以及一个冒号和一个表示访问标志的字符串组成

下面是一个使用正则表达式的实现:

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>[rwab+0-9]+)"       # The letters r, w, a, b, a '+' symbol, or any digit

    FILE_RESOURCE_PATTERN = SCHEME + PATH_PATTERN + r":" + FLAGS_PATTERN + r"$"     # The full pattern including the end of line character

    tokens = re.match(FILE_RESOURCE_PATTERN, string).groupdict()
    return tokens['path'], tokens['flags']
在表达式的第二部分中,我基本上是在尝试负前瞻
(~suffix+path+suffix)
,其中
suffix
“:“+flags+StringEnd()
。但是,在尝试解析
时file://foo:bar.txt:r+“
,我遇到以下错误:

pyparsing.ParseException: Expected ":" (at char 21), (line:1, col:22)
由于字符串长度为21个字符,我将其解释为
Regex
已“消耗”整个字符串,因此后缀不再“找到”

如何使用
pyparsing
修复
parse
方法?

尝试以下方法:

s="file://foo:bar.txt:r+"
path,flag=re.sub(r'.*\/\/(.*):(.*$)',r'\1,\2',s)

在基于re的解决方案中,re引擎可以进行前瞻和回溯以查找“:”,但在pyparsing中,正则表达式中的re不知道以下Suppress(“:”)表达式。尝试将
path
更改为
Regex(r“[^::+”)
,这将消耗除“:”之外的所有内容,实际上
路径可以包含冒号(
),如示例中所示,它是
foo:bar.txt
。因此从
Regex
中省略冒号是不行的。
s="file://foo:bar.txt:r+"
path,flag=re.sub(r'.*\/\/(.*):(.*$)',r'\1,\2',s)