有时,好的旧工具仍然效果最好。在SED,我可以写这样的事情:蟒蛇中的线条匹配范围(如sed范围)
sed '/^Page 5:/,/^Page 6:/p'
sed '110,/^Page 10:/+3p'
sed '/^Page 5:/,/^Page 6:/s/this/that/g'
第一施加取代成的那些匹配/ ^第5页之间的所有行:/和/ ^第6页:/。第二个在第110行开始打印,并在第一个匹配/第10页之后停止3行。第三个示例将替换应用于指定范围中的每一行。
我不介意使用re.search逐行搜索,但对于行范围,行号或相对偏移量,我最终不得不编写一个完整的解析器。有没有可以简化这种操作的Python成语或模块?
我不想从python中调用sed:我正在使用python类型的东西来处理文本,只是希望能够以直接的方式对线段进行操作。
编辑:如果解决方案工作在python的字符串列表上,这很好。我不想处理千兆字节的文本。但是我确实需要指定几个操作,而不仅仅是一个,并且用单行regexp替换来交叉它们。我已经看过迭代器(实际上我会欢迎使用迭代器的解决方案),但结果总是无法用于单一操作以外的任何事情。
下面是一个简单的例子:一个包含java风格评论的代码片段,将被改为python评论。 (别担心,我不是想编写使用正则表达式一个交叉编译:-)
/*
This is a multi-line comment.
It does not obligingly start lines with " * "
*/
x++; // a single-line comment
是微不足道的编写正则表达式是改变“//”评论“#”(也下降分号,将“++”改为“+ = 1”等)但是我们如何在多行的java注释的每一行的开始插入“#”?我可以将整个文件的正则表达式作为单个字符串来执行,这是一种痛苦,因为其余的转换都是面向行的。我也无法(有用地)将迭代器与面向行的正则表达式集成在一起。我会很感激的建议。
“最终不得不编写一个完整的解析器”?只是为了数线?为什么? – 2012-02-23 10:45:35
“但是我们如何在多行的java注释的每一行的开头插入”#“?”这是一个非常复杂得多的问题。与问题的标题和问题的第一部分无关。如果这是你真的想知道的,那么就单独询问**真实**问题。 – 2012-02-23 13:24:19
@S,我原来的问题是“我正在用文本做python类型的东西,只是希望能够以直接的方式在线范围内进行操作。”我想匹配线范围,以便与他们做一些事情,而不仅仅是打印出来。这是我的第一个SO问题,我正在学习很多关于如何防止错误部分得到所有关注的问题。 – alexis 2012-02-23 13:35:55