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

时间:2017-03-24 10:59:52

标签: 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 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']

我更喜欢使用PyParsing,因为如果字符串与表达式不匹配,它通常会提供更详细的错误消息(而不是简单地返回re.match的{​​{1}}) ,我最终想要None可选。

继Paul McGuire在python regex in pyparsing的回答后,我做了以下尝试:

flags

在表达式的第二部分中,我基本上尝试了负向前瞻from pyparsing import Word, alphas, nums, StringEnd, Regex, FollowedBy, Suppress, Literal def parse(string): scheme = Literal("file://") path = Regex(".+") flags = Word(alphas + nums + "+") expression = Suppress(scheme) + (~(Suppress(":") + flags + StringEnd()) + path("path") + Suppress(":") + flags("flags") + StringEnd()) tokens = expression.parseString(string) return tokens['path'], tokens['flags'] ,其中(~suffix + path + suffix)suffix。但是,在尝试解析":" + flags + StringEnd()时,我遇到以下错误:

"file://foo:bar.txt:r+"

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

如何使用Regex修复parse方法?

1 个答案:

答案 0 :(得分:0)

试试这个:

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