python正则表达式中的可选组

时间:2013-10-05 01:13:37

标签: python regex regex-greedy regex-group

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

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

differentroute, Awesome Title Ya'll;

(我正在写一个余烬应用程序)

所以我编写了一个递归公式,在各方面都运行良好,但是分割实际单个项目的正则表达式引起了各种各样的麻烦。

首先,赋予递归函数的整个字符串将被拆分为:

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()

并且在使用它的标签“unindented”之后递归处理该包。

否则使用此正则表达式:

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')

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

1 个答案:

答案 0 :(得分:2)

你的正则表达式使逗号可选,但不是之前的单词。您需要使组合可选:

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