我正在使用 python 2.6 并且在我的长程序中有一堆打印语句。如何用我的自定义打印函数替换它们,我们称之为 scribble()。因为如果我只是搜索并将 print 替换为 scribble( 没有结束的双引号。我认为正则表达式就是这样,但我已经用它们进行了一天左右的实验,我似乎无法让它工作。
6 回答
使用编辑器
我不知道您使用的是哪个编辑器,但如果它支持 RegEx 搜索和替换,您可以尝试以下操作:
Replace: print "(.*?)"
With: scribble( "\1" )
我在记事本++中对此进行了测试。
使用 Python
或者,您可以使用 Python 本身来完成:
import re
f = open( "code.py", "r" )
newsrc = re.sub( "print \"(.*?)\"", "scribble( \"\\1\" )", f.read() )
f.close()
f = open( "newcode.py", "w" )
f.write( newsrc )
f.close()
您可以重载打印功能,而不是替换它!
在 python 2.x 中,这是不可能的。但是有一些工具可以将 python 2.x 转换为 python 3 代码。
通过转换器运行您的代码,然后重载打印功能。
低于 2.6 的 python 版本仍然通过使用 from future支持打印函数(因此重载)。因此,一旦被隐藏,您的代码仍应适用于旧版本。虽然如果不使用 3.x 似乎大多数都在使用 2.7 所以你将来可能不需要
如果您还没有使用真正的 IDE,这是一个可以帮助您的地方。使用像 PyCharm 或 Eclipse 这样的 IDE,您可以使用重构来用不同的调用替换对特定函数的所有调用。
这是一个 Emacs 实现,默认情况下,它将打印语句转换为打印函数,并可选择将任何语句更改为任何函数。我试图清楚地记录它,但如果有任何不清楚的地方,请告诉我。
OP 可以与 . 交互M-x my-statement-to-function RET scribble RET
或以编程方式使用它(my-statement-to-function "print" "scribble")
。
(defun my-statement-to-function (&optional statement func)
"Convert STATEMENT to FUNC.
For use with statements in Python such as 'print'. Converts
statements like,
print \"Hello, world!\"
to a function like,
print(\"Hello, world\")
Also works generally so that the STATEMENT can be changed to any
FUNC. For instance, a 'print' statement,
print \"Hello, world!\"
could be changed to a function,
banana(\"Hello, world!\")
Default STATEMENT is 'print'. Default FUNC is
STATEMENT (e.g. 'print'). Prompt for STATEMENT and FUNC when
called with universal prefix, `C-u'."
(interactive "p")
(let* ((arg statement) ; statement argument overwritten, so preserve value
;; only prompt on universal prefix; 1 means no universal, 4 means universal
(statement (cond ((eql arg 1) "print") ; no prefix
((eql arg 4) (read-string "Statement (print): " "" nil "print")))) ; C-u
(func (cond ((eql arg 1) statement) ; no prefix
((eql arg 4) (read-string (concat "Function " "(" statement "): ") "" nil statement)))) ; C-u
;; [[:space:]]* -- allow 0 or more spaces
;; \\(\"\\|\'\\) -- match single or double quotes
;; \\(\\) -- define capture group for statement expression; recalled with \\2
(regexp (concat statement "[[:space:]]*\\(\"\\|\'\\)\\(.*?\\)\\(\"\\|'\\)"))
;; replace statement with function and place statement expression within parentheses \(\)
(replace (concat func "\(\"\\2\"\)")))
(goto-char (point-min))
(while (re-search-forward regexp nil t)
(replace-match replace))))