【问题标题】:Optional group in python regexpython 正则表达式中的可选组
【发布时间】:2013-10-05 01:13:37
【问题描述】:

我正在尝试编写一个读取以下格式的网站配置文件的函数:

routename, optional_path, Title With Spaces;
otherroute, other title {
    nestedroute, :can_have_semicolon, Nested Title;
};

differentroute, Awesome Title Ya'll;

(我正在写一个 ember 应用)

所以我写了一个递归公式,它在所有方面都运行良好,但是分割实际单个项目的正则表达式让我很头疼。

首先将给递归函数的整个字符串拆分为:

filter(None, re.split(r";\n*(\b|$)", routes))

这将最高级别的组分开(上面的示例最终会分成两部分,一个带括号,一个不带括号,但都没有尾随冒号)。

如果发现单个项目包含{},它将使用此正则表达式:

route, path, title, bundle = re.match(r"\s*(\w+)\s*,\s*(\S*?)\s*?,?\s*([\w ]+)\s*{\s*(.+)\s*}\s*", r, flags = re.S).groups()

在标签“未缩进”后递归处理包。

否则使用此正则表达式:

route, path, title = re.match(r"\s*(\w+)\s*,\s*(\S*?)\s*?,?\s*([\w ]+)\s*", r).groups()

这里它们都写得更清楚了,去掉了空格代码:

re.match(r"(\w+),(\S*?),?([\w ]+){(.+)}", r, flags = re.S).groups()
re.match(r"(\w+),(\S*?),?([\w ]+)", r).groups()

我一直有各种疯狂的行为。基本上,路径是可选的,但标题和路由是强制性的,并且标题需要能够包含空格。括号中的内容被不加选择地抓取,因为它将由这些相同的表达式递归处理。

我用过很多变种,有些根本不选择路径,有些没有它就无法运行,有些不支持路径中的:,有些分裂标题或从中随机删除字母或单词。有太多的变体,有太多的输入要记住。因为它代表第二个正则表达式(我专注于简单版本并在它工作后添加括号行为,因为括号行为似乎没有给出任何问题),输入如下:

customer, path, Customer Account

给出以下输出:

('customer', '', 'path')

但没有路径:

customer, Customer Account

它正在做我想做的事。

('customer', '', 'Customer Account')

如果您需要更多信息,请询问。已经这么久了。

【问题讨论】:

    标签: python regex regex-greedy regex-group


    【解决方案1】:

    您的正则表达式使逗号成为可选的,但不是它前面的单词。您需要将组合设为可选:

    (\w+),(?:(\S*?),)?([\w ]+){(.+)}
    

    【讨论】:

    • 啊!非捕获组。我不知道你能做到这一点!
    • 你也可以用捕获组来做,你只是忽略结果的那部分。
    猜你喜欢
    • 1970-01-01
    • 2010-11-04
    • 2013-09-09
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2010-11-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多