用于打印的正则表达式(vim)...用于将python2打印(...)到python3

时间:2014-03-23 11:20:05

标签: python regex python-2.7 vim python-3.3

只有在print命令中包含字符串时,此post才有用。 现在我有很多源代码和一个声明,如

print milk,butter

应格式化为

print(milk,butter)

使用\ n捕获行的结尾并不成功。任何提示?

2 个答案:

答案 0 :(得分:10)

您可以使用2to3并仅将修复程序应用于print语句 - >打印功能。

2to3 --fix=print [yourfiles]

这应该自动处理所有那些不能用于例如一个vim正则表达式。

如果由于某种原因缺少2to3 shell脚本,请将lib作为模块运行:

python -m lib2to3 --fix=print [yourfiles]

答案 1 :(得分:10)

我不熟悉2to3,但是从所有评论来看,它看起来都是正确的工具。

也就是说,也许我们可以用这个问题作为一些vim基础课程的借口。

首先,您需要一个与正确行匹配的模式。我认为^\s*print\>会这样做:

  • ^匹配行首(和$匹配行尾)。
  • \s匹配空格(空格或制表符)
  • *表示前一个原子的0或更多(尽可能多,或“贪婪”)。
  • print是一个文字字符串。
  • \>匹配词尾(零宽度)。您可以使用(文字)空格或\s\+代替。

接下来,您需要确定括在括号中的部分。由于*是贪婪的,.*将匹配行的结尾;没有必要把它固定在右边。使用\(\s*print\)\(.*\)来捕获各个部分,以便您可以在替换中将其引用为\1\2

现在,将各个部分放在一起。有很多变种,我没有试过“高尔夫”这个:

:%s/^\(\s*print\)\s\+\(.*\)/\1(\2)

有些人更喜欢“非常神奇”的版本,其中只有a-z,A-Z,0-9和_被视为文字字符;那么你不需要转义括号和加号:

:%s/^\v(\s*print)\s+(.*)/\1(\2)