regex (vim) for print ... to print(...) for python2 to python3
Posted
技术标签:
【中文标题】regex (vim) for print ... to print(...) for python2 to python3【英文标题】: 【发布时间】:2014-04-30 16:12:21 【问题描述】:这个post 仅在打印命令中有字符串时才有用。 现在我有大量的源代码,其中包含诸如
之类的语句print milk,butter
应该格式化为
print(milk,butter)
使用 \n 捕获行尾没有成功。有什么提示吗?
【问题讨论】:
正如 InspectorG4dget 在链接问题上所说:使用2to3 提示:你不会用\n
捕获行尾,你会用$
捕获它。
jonrsharpe:假设我只能使用 vim
【参考方案1】:
我对 2to3 不熟悉,但从所有 cmets 来看,它看起来是适合这项工作的正确工具。
也就是说,也许我们可以利用这个问题作为一些 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)
【讨论】:
按F3(“f*** python 3”的快捷方式)修复当前行的打印:nmap <F3> :s/^\(\s*print\)\s\+\(.*\)/\1(\2)<cr>
。注意:正则表达式不适合转换大量代码,仅适用于纠正同时使用 python2 和 python3 代码时偶尔出现的错误。【参考方案2】:
您可以使用2to3 并且仅将修复应用于打印语句 -> 打印函数。
2to3 --fix=print [yourfiles]
这应该会自动处理所有那些无法使用的奇怪情况,例如vim 正则表达式。
如果您由于某种原因缺少 2to3
shell 脚本,请将 lib 作为模块运行:
python -m lib2to3 --fix=print [yourfiles]
【讨论】:
【参考方案3】:因为你已经在 vim 中了:
:!2to3 --fix=print --write %
【讨论】:
以上是关于regex (vim) for print ... to print(...) for python2 to python3的主要内容,如果未能解决你的问题,请参考以下文章
shell function/for in/for (())/string concat/has dir/rename using regex/if(())/exit/execute command