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的主要内容,如果未能解决你的问题,请参考以下文章

python RegEx for URL模式

python RegEx for URL模式

使用 Regex For Zapier 提取根域

使用Regex解析数据库表名

shell function/for in/for (())/string concat/has dir/rename using regex/if(())/exit/execute command

Vim 在复制粘贴时缩进每一行代码