def save_lines(infile, outfile):
bracket_pattern = re.compile(r'{{(.*?)}}', re.DOTALL)
content = infile.read()
for mo in bracket_pattern.finditer(content):
outchars = mo.group(1)
outfile.write('matched: "{}" at position {}\n'.format(
outchars, mo.start()))
with open('/tmp/in') as input_file:
with open('/tmp/out', 'w') as output_file:
input = input_file.read()
output_file.write(''.join(re.findall(r'(?s)(?<={{).*?(?=}})', input)))
或者考虑使用如下方法:
罗布是对的。上述解决方案存在问题。在
并且,上面Rob给出的基于正则表达式的解决方案 对我来说是个不错的选择。在
这里有一个变化:
但是,根据您的需要,您可能还需要考虑 以下内容:(1)基于正则表达式的方法提供了 语法错误检查的灵活性很小。(2) 常规 表达式不支持递归语法,也就是说,如果 你需要解析的语法(我们讨论的是解析 问题)这里包含或扩展为包含嵌套语法 元素,正则表达式将不会有帮助。在
这是另一种基于有限状态机的解决方案。它 可能会为错误报告提供更多的灵活性。但是,是的 更长更复杂。这种复杂性是有代价的:(1) 开发时间(上面的正则表达式解决方案花了我很多时间 10~15分钟;这个FSM解决方案花了我几个小时);以及(2) 调试(这里有很多逻辑,大部分是if语句) 有很多方法会出错。在
因为它是基于有限状态机的,所以也不能扩展 (毫不困难地)支持处理嵌套的语法 (递归)构造。为此,您可能需要查看一个解析器 发电机。查看此列表: https://wiki.python.org/moin/LanguageParsing
从积极的一面来看,因为下面的代码是基于FSM的, 你可以画一个状态转换图来说明 假定代码在任何给定的情况下都可以接受(例如,只是 看到一个左大括号,里面有一个大括号 右花括号等)。在纸上,我把那张图画成 有向图(圆表示状态,圆之间的箭头表示 转换)。我觉得我做不到ascii艺术,所以 这是一个状态转换图的文本表示 可能看起来像:
^{pr2}$代码如下:
我会使用正则表达式,
re.findall()
:分解:
with
行打开相关的数据文件。你可能已经有这个了。在input_file.read()
创建一个包含文件内容的字符串。在re.findall()
的调用搜索:{{
,但从结果中排除它((?<={{)
)。在(?s)
)可能匹配到}}
(.*?
)}}
,但从结果中排除它((?=}})
)''.join()
将所有字符串粘贴在一起。在output_file.write()
的调用将结果存储到输出文件中。在相关问题 更多 >
编程相关推荐