我正在尝试编写一个以以下格式读取网站配置文件的函数:
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')
如果您需要更多信息,请询问。这已经是这么久了。